如何使用Moq模拟ObjectResult.FirstOrDefault()使用Moq
我在做一个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
这种类型的对象。帮我。
你不能创建一个ObjectResult的新实例,你不能嘲笑它,因为它被标记为密封。我建议您将数据上下文的使用情况包装到工作单元或类似模式中,以便在单元测试中进行测试。
你能解释一些代码吗? – Dilma 2012-07-13 20:07:03
我通常在存储库中包装我的上下文(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
Mocq只能模拟'virtual'方法,所以如果'sp_IsAuthorized'不是虚拟的,它根本就不起作用。 – nemesv 2012-07-13 12:19:48
@nemesv Ya.It。但我的问题是我应该在这个声明中返回什么, entity.Setup(x => x.sp_IsAuthorized(...))。Return(???); 我已经把问号。 – Dilma 2012-07-13 12:22:52
我删除了我的答案,因为我意识到代码可能会自动生成,因此您不会更改返回类型。我建议你阅读[这篇文章](http://msdn.microsoft.com/en-us/ff714955.aspx)关于可测试性和实体框架 – 2012-07-13 13:07:20