我正在使用NHibernate、ASP.NET MVC 2.0和StructureMap启动一个新项目,并使用NUnit和Moq进行测试。对于我的每个控制器,我都有一个单独的公共构造函数,其中注入了一个ISession。应用本身运行良好,但在单元测试方面,我基本上必须模拟一个ISession以便测试控制器。
当我尝试使用MOQ模拟ISession时,我会收到如下错误消息:
只支持中间调用中的属性访问
看起来我的问题是期望从框架CreateQuery方法获取用户列表,但在Google搜索该问题后,我现在更清楚了。
我的两个问题:
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类上的所有属性都是虚拟的。