如何模拟使用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

如何模拟使用Where子句并返回List的NhibernateSession查询

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容器。在其他地方,我都使用接口。这样,我的单元测试就有点自己产生了!:)

希望这个有用!

快乐编码,
干杯,
克里斯。