如何模拟使用Where子句并返回List的NhibernateSession查询
本文关键字:返回 子句 List 查询 NhibernateSession Where 何模拟 模拟 | 更新日期: 2023-09-27 18:22:25
我不知道如何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)
谢谢你的建议。
Stu
Query方法是一个扩展方法,如果我没记错的话,不能像moq那样嘲笑AFAIK。
是因为您从mock返回的新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());
作为一个有趣的问题,您是如何设置层的?这看起来像是你在使用一个具体的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容器。在其他地方,我都使用接口。这样,我的单元测试就有点自己产生了!:)
希望这个有用!
快乐编码,
干杯,
克里斯。