Как я могу сделать этот запрос против ravendb - PullRequest
3 голосов
/ 18 февраля 2012

У меня есть этот код в моем проекте, как я могу использовать 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 ]

6 голосов
/ 18 февраля 2012

Вместо того, чтобы издеваться над сессией документа, задумывались ли вы об использовании embeddabledocumentstore? Он может работать полностью в памяти, и у вас будет полная база данных для ваших тестов.

См. Также этот пост в блоге, который описывает некоторые фоны: http://novuscraft.com/blog/ravendb-and-the-repository-pattern

6 голосов
/ 18 февраля 2012

Этот вопрос вдохновил сообщение в блоге .

Краткий ответ: Не надо. Вы связываете свое приложение с RavenDB и нарушаете принцип разделения интерфейса. Вместо этого напишите пользовательский интерфейс, который точно определяет, какие услуги нужны вашему классу (тестируемой системе). Напишите класс-оболочку, который реализует это и делегирует RavenDB. Это может использовать шаблон репозитория или что-то более простое. Ваш интерфейс должен быть простым для макета.

1 голос
/ 18 февраля 2012

Вам нужно смоделировать все, что IDocumentSession.Query () возвращает как отдельный макет, чтобы вы могли затем настроить вызов customize. Я набираю это на своем телефоне, поэтому не могу легко привести пример.

...