2012-02-17 4 views
2

내 프로젝트에이 코드가 있습니다. moq를 사용하여 문서 세션을 moq하고 반환 값을 설정하려면 어떻게해야합니까? ravendb에 대해이 쿼리를 moq하려면 어떻게해야합니까?

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

내가이 예외를 throw

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); 

물어 내가

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 

답변

5

문서 세션을 조롱하는 대신 embeddabledocumentstore 사용에 대해 생각해 보셨습니까? 메모리에서 완전히 실행될 수 있으며 테스트를위한 백엔드로 전체 데이터베이스를 보유하게됩니다. http://novuscraft.com/blog/ravendb-and-the-repository-pattern

+0

필자가 제안한대로 embeddabledocumentstore를 사용했으나 훌륭하게 작동하지만 내 단위 테스트는 이제 많은 코드를 테스트합니다. 감사! – Marcus

+0

@Marcus Moq를 사용할 때 테스트되는 더 많은 코드에 관한 요점은 어디입니까? 이 정의를 통해 Moq는 또한 테스트 된 추가 코드입니다 – ccellar

0

당신은 조롱하는 데 필요한 MOQ를 변경하는 방법을 알아낼 수 없습니다 전에 내가 시도 것입니다 IDocumentSession.Query()가 별도의 mock으로 반환하므로 사용자 정의 호출을 설정할 수 있습니다. 전화에이 내용을 입력하면 쉽게 예제를 줄 수 없습니다.

5

이 질문 blog post 영감 :

또한 배경의 일부를 설명하는이 블로그 게시물을 참조하십시오.

짧은 대답 : 하지 마십시오. 애플리케이션을 RavenDB에 연결하고 인터페이스 분리 원칙을 위반합니다. 대신 클래스 (테스트중인 시스템)에 필요한 서비스를 정확하게 지정하는 사용자 지정 인터페이스를 작성하십시오. RavenDB에 위임자와 위임자를 구현하는 래퍼 클래스를 작성합니다. 이것은 리포지토리 패턴을 사용할 수도 있고 더 단순한 것이 될 수도 있습니다. 인터페이스는 모의하기 쉽습니다.

+2

RavenDB가 제공하고 제공 할 우수한 클라이언트 API가 서비스와 같은 추상화를 생성하지 않기 때문에 나는 이전에이 길을 따라갔습니다.이 경우 ravendb를 사용하면 좋지 않았습니다. 내 서비스 http://cl.ly/EJsI에서 이런 무관 한 코드를 많이, 비록 당신의 대답에 감사드립니다. – Marcus

+1

Ayende 파티 라인에 행운을 비네. "YAGNI! 불필요한 추상화! 단원 테스트를 할 필요가 없습니다. 왜 RavenDB/NHibernate/등을 대체할까요?" 어쩌면 그에게 도움이 될지 모르겠지만, 우리가 나머지는 가장 간단한 경우를 제외하고는 어떻게 작동하는지 보지 못합니다. – TrueWill

+0

"어쩌면 내 단위 테스트가 지금 많은 코드를 테스트합니다." - 정확히 내 요점이야. – TrueWill

관련 문제