문제

내가 사용하는 NMock2,그리고 내가 초안을 작성 다음 NMock 을 표현하는 클래스 일반적인 모의 프레임워크 개념:

  • Expect:이 지정하는 조롱 방법을 반환해야한다고 말한다는 전화를 발생해야 하는 또는 테스트를 실패할 경우(전화와 함께 VerifyAllExpectationsHaveBeenMet()).

  • Stub:이 지정하는 조롱 방법을 반환해야 하지만 일으키는 원인이 될 수 없습 테스트 실패합니다.

그렇게해야하는가 하면?

도움이 되었습니까?

해결책

많은 조롱 프레임 워크가 조롱과 스터브의 개념을 더 가깝게 그리고 더 가깝게 가져와 기능적으로 거의 동일하게 간주 될 수 있습니다. 그러나 개념적 관점에서 볼 때, 나는 보통이 컨벤션을 따르려고 노력합니다.

  • 모조품: 테스트중인 객체의 동작을 명시 적으로 확인하려고 할 때만 (즉, 테스트는이 개체가 해당 객체를 호출해야한다고 말합니다).
  • 그루터기: 일부 기능/동작을 테스트하려고 할 때는 작업을 수행하려면 일부 외부 객체에 의존해야합니다 (즉, 테스트는이 개체가 무언가를해야한다고 말하지만 부작용으로 불릴 수 있습니다. 물체)

각 단위 테스트가 한 가지만 테스트하는지 확인하면 더 명확 해집니다. 한 번의 테스트에서 모든 것을 테스트하려고한다면 모든 것을 기대할 수 있습니다. 그러나 특정 단위 테스트가 확인하는 것만 기대함으로써 테스트의 목적이 무엇인지 알 수 있기 때문에 코드가 훨씬 더 명확합니다.

이것의 또 다른 이점은 변경으로 인해 약간 더 절연되고 변경으로 인해 휴식이 발생할 때 더 나은 오류 메시지를 얻는 것입니다. 다시 말해서, 구현의 일부를 미묘하게 변경하면 하나의 테스트 케이스가 깨지 않을 가능성이 높아져 전체 테스트 스위트가 깨지고 소음을 생성하는 것이 아니라 깨진 내용을 정확하게 보여줍니다.

편집하다: 계산기 객체가 데이터베이스 (의사 코드)에 추가 된 모든 추가를 감사하는 예제를 기반으로 더 명확 할 수 있습니다 ...

public void CalculateShouldAddTwoNumbersCorrectly() {
    var auditDB = //Get mock object of Audit DB
    //Stub out the audit functionality...
    var calculator = new Calculator(auditDB);
    int result = calculator.Add(1, 2);
    //assert that result is 3
}

public void CalculateShouldAuditAddsToTheDatabase() {
    var auditDB = //Get mock object of Audit DB
    //Expect the audit functionality...
    var calculator = new Calculator(auditDB);
    int result = calculator.Add(1, 2);
    //verify that the audit was performed.
}

따라서 첫 번째 테스트 사례에서 우리는 Add 메소드 및 감사 이벤트가 발생하는지 여부를 신경 쓰지 않지만 계산기가 AuditDB 참조와 함께 작동하지 않으므로 특정 테스트 케이스를 얻기 위해 최소한의 기능을 제공하기 위해 스터치합니다. 일하고 있는. 두 번째 테스트에서 우리는 구체적으로 당신이 할 때 Add, 감사 이벤트가 발생하므로 여기서 기대치를 사용합니다 (결과가 무엇인지 신경 쓰지 않아도됩니다. 왜냐하면 우리가 테스트하는 것이 아니기 때문입니다).

예, 두 가지 사례를 하나로 결합하고 기대치를 수행하고 결과가 3이라고 주장 할 수 있지만 한 번의 단위 테스트에서 두 가지 사례를 테스트하고 있습니다. 이렇게하면 테스트를 더욱 부서지기 쉽고 (테스트를 중단하기 위해 변경할 수있는 더 큰 표면적이 있기 때문에) 명확하지 않기 때문에 (병합 된 테스트가 실패했을 때 문제가 무엇인지 즉시 명확하지 않기 때문에 .. 추가가 작동하지 않는 것입니다. 아니면 감사가 작동하지 않습니까?)

다른 팁

"행동, 스터브 쿼리를 기대하십시오". 전화가 테스트중인 객체 외부의 세계 상태를 변경 해야하는 경우,이를 기대하는 방법에 관심을 갖습니다. 단지 쿼리라면 시스템 상태를 변경하지 않고 한 번 또는 6 번 호출 한 다음 호출을 스텁 할 수 있습니다.

한 가지 더, 한 가지 더, 차이는 스터브와 기대, 즉 개별 호출, 반드시 전체 객체는 아닙니다.

음...이럴 수 없다 더 간단하다:는 경우에 당신의 테스트에 대한 손님들의 발표자가 부를 것이 저장,않는 기대합니다.는 경우에 당신의 테스트에 대한 손님들의 발표자 처리는 예외 경우 정상적으로 저장을 발생 할 Stub.

자세한 정보는 확인 이 팟 캐스트로 hanselman 은고 Osherove (저자의 예술의 유닛 테스트)

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top