我的项目中有这个代码,如何使用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
答案 0 :(得分:6)
您是否考虑过使用embeddabledocumentstore而不是模拟文档会话?它可以完全在内存中运行,并且您拥有完整的数据库作为测试的后端。
另请参阅此博客文章,其中介绍了一些背景:http://novuscraft.com/blog/ravendb-and-the-repository-pattern
答案 1 :(得分:6)
这个问题启发了blog post。
简短回答:不要。您将应用程序与RavenDB耦合并违反了接口隔离原则。相反,编写一个自定义接口,准确指定您的类(被测系统)需要哪些服务。编写一个实现它的包装类并委托给RavenDB。这可能使用存储库模式,或者它可能更简单。你的界面应该很容易模拟。
答案 2 :(得分:1)
您需要模拟IDocumentSession.Query()作为单独的模拟返回的任何内容,以便您可以设置自定义调用。我正在手机上打字,所以我不能轻易给你一个例子。