Nunit 我怎样才能对ravendb进行moq查询

Nunit 我怎样才能对ravendb进行moq查询,nunit,moq,ravendb,Nunit,Moq,Ravendb,我的项目中有这段代码,如何使用Moq来Moq documentsession并设置返回值 _session.Query<IPageModel, PageByUrl>() .Customize(x => x.WaitForNonStaleResultsAsOfLastWrite()) .FirstOrDefault(x => x.Metadata.Url == virtualUrl); \u session.Query() .Customize(x=>x.WaitForN

我的项目中有这段代码,如何使用Moq来Moq documentsession并设置返回值

_session.Query<IPageModel, PageByUrl>()
.Customize(x => x.WaitForNonStaleResultsAsOfLastWrite())
.FirstOrDefault(x => x.Metadata.Url == virtualUrl);
\u session.Query()
.Customize(x=>x.WaitForNonSalesultsAsoflastWrite())
.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);
var session=newmock();
var pageModel=新的DummyModel();
session.Setup(x=>x.Query()
.Customize(y=>y.WaitForNonSalesultsAsoflastWrite())
.FirstOrDefault(y=>y.Metadata.Url==path)).Returns(pageModel);
这引发了一个异常,我不知道如何更改最小起订量

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 
System.NotSupportedException:表达式引用的方法不属于模拟对象:x=>x.Query().Customize(y=>y.WaitForNonSaleSultsAsoflastWrite()).FirstOrDefault(y=>y.Metadata.Url==.path)
在Moq.Mock.c_uuu显示Class1C`2.b_uuu1b()
在Moq.Mock.Setup(Mock-Mock,表达式'1表达式,函数'1条件)
在Moq.Mock`1.设置时(表达式`1表达式)
在brickfile.Tests.Web.Routing.PathResolverTests.Home\u Page\u中,使用PathResolverTests.cs中的默认操作(字符串路径):第26行

您需要模拟IDocumentSession.Query()作为单独的模拟返回的任何内容,这样您就可以设置自定义调用。我在手机上打这个,所以我不能简单地给你举个例子。

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

另请参阅这篇描述一些背景的博文:

这个问题引发了一场争论


简短的回答是:不要。您将应用程序耦合到RavenDB,违反了接口隔离原则。相反,编写一个定制接口,精确地指定类(测试中的系统)需要什么样的服务。编写一个包装器类来实现它并委托给RavenDB。这可能使用存储库模式,也可能更简单。你的界面应该很容易模仿。

我之前就这么做过,在本例中,对于ravendb,我不喜欢它,因为创建一个类似服务的抽象隐藏了ravendb拥有的优秀客户端API,并将在我的服务中为我提供大量类似这样的无关代码,谢谢你的回答。祝你在艾伦德派对上好运。解释他的话:“YAGNI!不必要的抽象!不需要单独进行单元测试。你为什么要替换RavenDB/NHibernate/等等?”也许它对他有效,但我不知道除了最简单的情况外,它对我们其他人如何有效。“也许我的单元测试现在测试了一点到很多代码。”-这正是我的观点。我所看到的不抽象RavenDB的唯一缺点是它会导致单元测试的速度稍慢。因此,对孤立的东西进行单元测试比初始化内存中的RavenDB并进行测试要快得多(在我的计算机上,测试似乎滞后了几秒钟)。@Spoike-很高兴知道。我认为它也是更好的设计,而且如果出现更好的东西,它可以让你选择快速切换技术。正如你所建议的,我使用了EmbeddedableDocumentStore,它工作得很好,但也许我的单元测试现在测试了一点到更多的代码。谢谢@Marcus在使用Moq时测试更多代码的要点是什么?根据这个定义,Moq也是经过测试的附加代码