我无法弄清楚Rhino如何嘲笑以下声明:
var jobs = nhibernateSession.Query<Job>()
.Where(x => x.Trust.Id == 1)
.ToList();
我尝试了各种排列,但目前不成功的尝试是:
nhibernateSession.Expect(y => y.Query<Job>())
.IgnoreArguments()
.Return(new List<Job> { new Job() }.AsQueryable());
我得到的错误是:
Source: Anonymously Hosted DynamicMethods Assembly
Message: Object reference not set to an instance of an object.
StackTrace: at lambda_method(Closure , Job )
at System.Linq.Enumerable.WhereListIterator`1.MoveNext()
at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
感谢您的任何建议。
斯图
答案 0 :(得分:3)
是否因为您从模拟中返回的新Job()对象的'Trust'属性为null?
这将解释where子句中的NullReferenceException:
.Where(x => x.Trust.Id == 1)
如果这是问题,修复是:
nhibernateSession.Expect(y => y.Query<Job>())
.IgnoreArguments()
.Return(new List<Job> { new Job{ Trust = new Trust() } }.AsQueryable());
答案 1 :(得分:3)
如果我没记错的话,查询方法是一种扩展方法,不能像使用moq一样嘲笑AFAIK。
答案 2 :(得分:2)
感兴趣的是 - 您如何设置图层?看起来你使用了一个具体的NHibernateSession,无论如何都会很难进行模拟。我的建议是使用ISession,然后你可以轻松地模拟它。
我不熟悉Rhino,但是使用Moq我会做的:
Mock<ISession> MockSession = new Mock<ISession>();
MockSession.Setup(x => x.Query<It.IsAny<Job>()>())
.Returns(new Lis<Job> { new Job()}.AsQueryable());
通常,接口比具体类更容易模拟。事实上,我使用具体类的唯一地方是静态配置方法,我必须设置我的IoC容器。在其他地方,我使用接口。这样,我的单元测试有点自己生产! :)
希望这有一些用处!
快乐的编码,
干杯,
克里斯。