2013-12-22 3 views
1

내 응용 프로그램은 CQRS 패턴과 저장소를 사용하여 설계되었습니다. 데이터베이스에 연결하지 않고 명령 클래스의 단위 테스트를 만들려면 어떻게해야합니까?모의 저장소가있는 단위 테스트 명령 클래스

우리는 Moq을 사용하여 저장소의 모의물을 만듭니다.

+0

"명령 클래스"에 어떤 논리가 있습니까? 그들은 리포지토리를 사용합니까? DB를 직접 호출합니까? –

답변

2

데이터베이스 레이어를 조롱해야합니다. 마찬가지로 데이터베이스 레이어 대신 모조 리포지토리 레이어를 사용할 수도 있습니다. 물론

[TestClass] 
public class TestCommandServiceTests 
{ 
    private readonly TestService _testService; 
    private readonly ITestRepositor _testRepository; 
    private readonly Mock<IDatabaseLaye> _mock; 

    [SetUp] 
    public void Setup() 
    { 
     _mock = new Mock<IDatabaseLayer>(); 
     _testRepository = new TestRepository(_mock); 
     _testService = new TestService(_testRepository); 
    } 

    [Test] 
    public void TestMethod_ValidRequest_ShouldTestSuccessfully() 
    { 
     // Arrange 
     var request = new TestMethodRequest(); 
     this._mock.Setup(c => c.TestSPMethod(null)).Returns(1000); 

     // Act 
     var response = _testService.TestMethod(request); 

     // Assert 
     Assert.IsNotNull(response); 
     Assert.AreEqual(1000, response.Id); 
    } 
} 
1

당신은 할 수 데이터베이스를 조롱 (그리고 당신도해야한다, 교과서를 말한다) . 그러나 이것은 특히 복잡한 데이터베이스 제약 조건이 작용할 때 매우 성가 시게됩니다.

실제로는 로컬 테스트 데이터베이스 (예 : 가능한 경우 SQLite 또는 MS SQL CE)를 사용하고 전체 '지속성 스택'(예 : 명령, 리포지토리 AND)에 대해 테스트하는 것이 더 생산적 일 수 있습니다 데이터베이스). 이것은 책 The Art of Unit Testing에서 권장되는 방법이며, 실제로는 매우 유용하다는 것을 알았습니다.