2012-07-13 94 views
0

我在做一个ASP.Net MVC2项目并在其上开发一些单元测试用例。在我的控制器之一,如何使用Moq模拟ObjectResult.FirstOrDefault()使用Moq

String AllowedActions = ""; 
AllowedActions = entities.sp_IsAuthorized(GetLoggedUserId(), 1, item.SubCategoryId, "CreateMeeting_HTML").FirstOrDefault(); 

我无法嘲笑这个sp_IsAuthorized()方法,

public ObjectResult<global::System.String> sp_IsAuthorized(.....){ 

} 

我试着模拟它以这种方式,

var entity = new Mock<TestMVCProductEntities>(); 
entity.Setup(x => x.sp_IsAuthorized(...)).Return(???); 

但我有不知道怎么回

ObjectResult

这种类型的对象。帮我。

+0

Mocq只能模拟'virtual'方法,所以如果'sp_IsAuthorized'不是虚拟的,它根本就不起作用。 – nemesv 2012-07-13 12:19:48

+0

@nemesv Ya.It。但我的问题是我应该在这个声明中返回什么, entity.Setup(x => x.sp_IsAuthorized(...))。Return(???); 我已经把问号。 – Dilma 2012-07-13 12:22:52

+0

我删除了我的答案,因为我意识到代码可能会自动生成,因此您不会更改返回类型。我建议你阅读[这篇文章](http://msdn.microsoft.com/en-us/ff714955.aspx)关于可测试性和实体框架 – 2012-07-13 13:07:20

回答

1

你不能创建一个ObjectResult的新实例,你不能嘲笑它,因为它被标记为密封。我建议您将数据上下文的使用情况包装到工作单元或类似模式中,以便在单元测试中进行测试。

+0

你能解释一些代码吗? – Dilma 2012-07-13 20:07:03

+0

我通常在存储库中包装我的上下文(LINQ to SQL和EntityFramework)和会话(NHibernate)。这使得模拟依赖于数据的类中的存储库成为可能。具有ObjectContext的Repository模式在此博客文章中详细描述:http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/ – ThomasArdal 2012-07-17 20:00:15