我怎样才能对ravendb进行查询

Mar*_*cus 3 nunit moq ravendb

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

_session.Query<IPageModel, PageByUrl>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.FirstOrDefault(x => x.Metadata.Url == virtualUrl);
Run Code Online (Sandbox Code Playgroud)

这是我在问之前尝试过的

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);
Run Code Online (Sandbox Code Playgroud)

抛出一个异常,我无法弄清楚如何更改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 
Run Code Online (Sandbox Code Playgroud)

cce*_*lar 6

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

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


Tru*_*ill 6

这个问题启发了一篇博文.

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

  • 我早些时候走了这条路,在这种情况下,ravendb我不喜欢它因为创建像服务这样的抽象隐藏了RavenDB所拥有的优秀客户端API,并且会在我的服务http中给我很多不相关的代码://cl.ly/EJsI,谢谢你的回答. (2认同)