2013-10-30 3 views
2

그래서 단위 테스트를 위해 프레임 워크 (Moq)를 조롱하고 놀고 있는데 조롱 프레임 워크를 사용해야 할 때 궁금해하십니까? 조롱 프레임 워크는 종속성을 제거하는 데 사용되기 때문에 단위 테스트는 테스트 할 수있는 "단위"에 초점을 맞출 것이다Mocking Framework는 언제 사용합니까?

public class Tests 
{ 
    [Fact] 
    public void TestWithMock() 
    { 
     // Arrange 
     var repo = new Mock<IRepository>(); 

     var p = new Mock<Person>(); 
     p.Setup(x => x.Id).Returns(1); 
     p.Setup(x => x.Name).Returns("Joe Blow"); 
     p.Setup(x => x.AkaNames).Returns(new List<string> { "Joey", "Mugs" }); 
     p.Setup(x => x.AkaNames.Remove(It.IsAny<string>())); 

     // Act 
     var service = new Service(repo.Object); 
     service.RemoveAkaName(p.Object, "Mugs"); 

     // Assert 
     p.Verify(x => x.AkaNames.Remove("Mugs"), Times.Once()); 
    } 

    [Fact] 
    public void TestWithoutMock() 
    { 
     // Arrange 
     var repo = new Mock<IRepository>(); 

     var p = new Person { Id = 1, Name = "Joe Blow", AkaNames = new List<string> { "Joey", "Mugs" } }; 

     // Act 
     var service = new Service(repo.Object); 
     service.RemoveAkaName(p, "Mugs"); 

     // Assert 
     Assert.True(p.AkaNames.Count == 1); 
     Assert.True(p.AkaNames[0] == "Joey"); 
    } 
} 
+3

모킹을 사용하면 테스트하지 않는 모든 변수를 제어 할 수 있으므로 한 코드 만 테스트 할 수 있습니다. – paqogomez

+2

+1 paqogomez 즉, 조롱을 통해 테스트중인 코드를 분리 할 수 ​​있으므로 특정 코드 조각 만 테스트 할 수 있습니다. 이점은 빨간색 또는 녹색 테스트 결과가 코드의 어느 부분이 잘못되었는지 나타냅니다. 당신은 일반적으로 서비스를 모의하지만 종종 더 많이 모의합니다. 그러나 여기에서는 사람이 조롱받을 필요가 거의 없습니다. – citykid

답변

1

:

다음 두 시험의 장점/단점은 무엇입니까. 귀하의 경우, 그 사람은 간단한 엔티티 클래스처럼 보이지만, 그것을 위해 Mocking을 사용할 필요가 없습니다.

1

조롱은 특히 신속한 출시주기가 많으면 시스템 구축 및 실제 데이터가 불완전하다는 민첩한 프로그래밍에서 많은 이점이 있습니다. 그런 경우에 ui 또는 서비스에 대한 작업을 계속하기 위해 생산 코드를 모방하기 위해 저장소를 조롱 할 수 있습니다. 이것은 대개 Ninject와 같은 IoC 메커니즘으로 보완되어 실제 리포지토리로의 전환을 단순화합니다. 당신이주는 두 가지 예는 평등하며 다른 상황이 없다면 나는 그것들 사이에서 선택의 문제라고 말할 것입니다. moq의 유창한 API는 자체 문서화의 종류로 읽기가 쉬울 수도 있습니다. 그래도 내 의견이야)

1

모의는 고립되어 기능 할 수없는 개체를 테스트하는 데 사용됩니다. 함수 A가 함수 B에 종속적이라고 가정하고, 함수 A에 대한 단위 테스트를 수행합니다. 함수 B의 테스트를 끝내기도합니다. 모의를 사용하여 함수 B의 기능을 시뮬레이트하고 테스트는 함수 A에만 집중할 수 있습니다.

7

사용 모의 객체를 단위 테스트 만들기 - 모든 종속성이 올바르게 작동하는 것으로 간주되는 테스트이며 SUT (테스트중인 시스템 - 테스트중인 클래스를 말하는 멋진 방법) 공장.

mock 개체는 구성 결과를 생성하는 종속성의 모의 버전을 작성하기 때문에 종속성 함수를 올바르게 "보증"하는 데 도움이됩니다. 그런 다음 질문은 테스트중인 한 클래스가 다른 모든 것이 "작동 중"일 때처럼 동작합니다.

모의 객체는 데이터베이스 또는 웹 서비스와 같이 종속성이 느린 객체를 테스트 할 때 특히 중요합니다. 실제 데이터베이스를 방문하거나 실제 웹 서비스 호출을하려면 테스트를 실행하는 데 더 많은 시간이 필요합니다. 몇 초 밖에 걸리지 않을 때도 용인 될 수 있지만, continuous integration 서버에서 수 백건의 테스트를 실행하면 정말 빨라지고 자동화가 곤란합니다.

이것은 모의 객체를 중요하게 만드는 것입니다. 빌드 테스트 배포 사이클 시간이 줄어 듭니다. 효과적인 소프트웨어 개발을 위해서는 테스트를 빨리 실행하는 것이 중요합니다.

1

조롱 프레임 워크는 테스트중인 코드에서 통합 지점을 시뮬레이션하는 데 유용합니다. 코드에 의존성 (Person)을 직접 삽입 할 수 있으므로 구체적인 예가 조롱하는 프레임 워크의 좋은 후보는 아니라고 주장합니다. 조롱 프레임 워크를 사용하면 실제로이 경우 복잡한 작업이 수행됩니다.

데이터베이스를 호출하는 리포지토리가있는 경우 훨씬 더 나은 사용 사례입니다. 유닛 테스트 관점에서 DB 호출을 모방하고 미리 결정된 데이터를 반환하는 것이 바람직합니다. 이 기능의 주요 장점은 데이터 유출에 대한 종속성을 제거하는 것이지만 db 호출은 테스트 속도를 늦추어 성능을 저하시킵니다.

2

단위 테스트를 작성하는 데 몇 가지 규칙이 있습니다.

  1. 테스트중인 시스템 (SUT) 또는 테스트중인 개체에 종속성이있는 경우 모두를 조롱합니다.
  2. 결과를 반환하는 메서드를 테스트하면 I 검사 결과 만 반환합니다. 종속성이 메소드의 매개 변수로 전달되면 조롱해야합니다. (1 참조)
  3. 'void'방법을 테스트하면 모의 테스트가 테스트를위한 최상의 옵션입니다.

마틴 파울러 (Martin Fowler)가 쓴 하나의 기사가 있습니다. Mocks Aren't Stubs.

첫 번째 테스트에서는 Mock을 사용하고 두 번째 테스트에서는 Stub을 사용합니다.

또한 귀하의 질문에 이르게하는 디자인 문제가 있습니다.

AkaNameAkaNames 콜렉션에서 제거 할 수 있다면 스텁을 사용하여 사람의 상태를 확인하는 것이 좋습니다. 특정 메소드 void RemoveAkaName(string name)Person 클래스에 추가하면 호출을 검증하기 위해 mocks를 사용해야합니다. 그리고 RemoveAkaName의 논리는 Person 클래스 테스트의 일부로 테스트해야합니다.

product에 스텁을 사용하고 repository을 모의로 사용합니다.