【发布时间】:2009-12-01 20:57:48
【问题描述】:
我正在使用 NHibernate、ASP.NET MVC 2.0 和 StructureMap 开始一个新项目,并使用 NUnit 和 Moq 进行测试。对于我的每个控制器,我都有一个公共构造函数,一个 ISession 被注入其中。应用程序本身工作得很好,但就单元测试而言,我基本上必须模拟一个 ISession 才能测试控制器。
当我尝试使用 MOQ 模拟 ISession 时,我收到以下错误消息:
仅支持属性访问 在中间调用中
看来我的问题是期待来自框架 CreateQuery 方法的用户列表,但在谷歌搜索问题后,我现在更清楚了。
我有两个问题:
1) 这是模拟 ISession 依赖注入的错误方法吗
2) 有没有办法修改代码,使其能够成功返回我的列表
[Test]
public void DummyTest()
{
var mock = new Mock<ISession>();
var loc = new Mock<User>();
loc.SetupGet(x => x.ID).Returns(2);
loc.SetupGet(x => x.FirstName).Returns("John");
loc.SetupGet(x => x.LastName).Returns("Peterson");
var lst = new List<User> {loc.Object};
mock.Setup(framework => framework.CreateQuery("from User").List<User>()).Returns(lst);
var controller = new UsersController(mock.Object);
var result = controller.Index() as ViewResult;
Assert.IsNotNull(result.ViewData);
}
请注意,我很确定我可以创建一个硬编码的用户列表(而不是模拟单个用户并将其添加到列表中),但我认为我会保留我现在拥有的代码。
此外,这个特定控制器的 Index 操作本质上是执行上面模仿的 CreateQuery 调用以返回数据库中的所有用户。这是一个人为的例子 - 不要阅读任何细节。
提前感谢您的帮助
编辑:在回复下面的评论时,我正在为错误添加堆栈跟踪。此外,User 类的所有属性都是虚拟的。
测试用例 'Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView' 失败:System.NotSupportedException: 仅支持属性访问 在对 a 的中间调用中 设置。不支持的表达式 framework.CreateQuery("来自用户")。 在 Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression m) 在 Moq.ExpressionVisitor.Visit(表达 exp)在 Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall(MethodCallExpression m) 在 Moq.ExpressionVisitor.Visit(表达 exp)在 Moq.Mock.AutoMockPropertiesVisitor.SetupMocks(表达式 表达式)在 Moq.Mock.GetInterceptor(LambdaExpression lambda,模拟模拟)在 Moq.Mock.c__DisplayClass12
2.<Setup>b__11() at Moq.PexProtector.Invoke[T](Func1 功能)在 Moq.Mock.Setup[T1,TResult](模拟模拟, 表达式1 expression) at Moq.Mock1.Setup[TResult](表达式`1 表达) 控制器\UserControllerTest.cs(29,0): 在 Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView()
【问题讨论】:
-
你能显示错误的堆栈跟踪吗?用户属性是抽象的还是虚拟的?
标签: c# .net unit-testing nhibernate moq