我怎样才能对ravendb进行查询

时间:2012-02-17 20:12:38

标签: nunit moq ravendb

我的项目中有这个代码,如何使用Moq来管理文档并设置返回值?

_session.Query<IPageModel, PageByUrl>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.FirstOrDefault(x => x.Metadata.Url == virtualUrl);

这是我在问过之前尝试过的。

var session = new Mock<IDocumentSession>();
var pageModel = new DummyModel();
session.Setup(x => x.Query<IPageModel, PageByUrl>()
.Customize(y => y.WaitForNonStaleResultsAsOfLastWrite())
.FirstOrDefault(y => y.Metadata.Url == path)).Returns(pageModel);

这引发异常,我无法弄清楚如何更改moq

System.NotSupportedException : Expression references a method that does not belong to the mocked object: x => x.Query<IPageModel,PageByUrl>().Customize(y => y.WaitForNonStaleResultsAsOfLastWrite()).FirstOrDefault<IPageModel>(y => y.Metadata.Url == .path)
at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b()
at Moq.Mock.Setup(Mock mock, Expression`1 expression, Func`1 condition)
at Moq.Mock`1.Setup(Expression`1 expression)
at BrickPile.Tests.Web.Routing.PathResolverTests.Home_Page_With_Default_Action(String path) in PathResolverTests.cs: line 26 

3 个答案:

答案 0 :(得分:6)

您是否考虑过使用embeddabledocumentstore而不是模拟文档会话?它可以完全在内存中运行,并且您拥有完整的数据库作为测试的后端。

另请参阅此博客文章,其中介绍了一些背景:http://novuscraft.com/blog/ravendb-and-the-repository-pattern

答案 1 :(得分:6)

这个问题启发了blog post

简短回答:不要。您将应用程序与RavenDB耦合并违反了接口隔离原则。相反,编写一个自定义接口,准确指定您的类(被测系统)需要哪些服务。编写一个实现它的包装类并委托给RavenDB。这可能使用存储库模式,或者它可能更简单。你的界面应该很容易模拟。

答案 2 :(得分:1)

您需要模拟IDocumentSession.Query()作为单独的模拟返回的任何内容,以便您可以设置自定义调用。我正在手机上打字,所以我不能轻易给你一个例子。