2009-07-02 7 views
5

그래서 내가하는 방법과 클래스가 캐싱과 같은 구현 세부 방법은 다음과 같습니다내가 단위 테스트는 다음과 같이

public class SomeClass 
{ 
    ... 

    private SomeDependency m_dependency; 

    public int DoStuff() 
    { 
     int result = 0; 
     ... 
     int someValue = m_dependency.GrabValue(); 
     ... 
     return result; 
    } 
} 

를 내가 때마다 m_dependency.GrabValue()를 호출하기보다는 그 결정했습니다를, 난 정말 캐시에 원하는 어쨌든 매번 동일한 값을 얻으므로 메모리의 값 (이 클래스의 값)은 (의존성이 사라지고 거의 변경되지 않는 테이블에서 일부 데이터를 가져옵니다).

단위 테스트에서이 새로운 동작을 설명하려고하지만 문제가 발생했습니다. 나는 다음을 시도했다. (RhinoMocks에서 NUnit을 사용하고있다.)

[Test] 
public void CacheThatValue() 
{ 
    var depend = MockRepository.GeneraMock<SomeDependency>(); 

    depend.Expect(d => d.GrabValue()).Repeat.Once().Return(1); 

    var sut = new SomeCLass(depend); 
    int result = sut.DoStuff(); 
    result = sut.DoStuff(); 
    depend.VerifyAllExpectations(); 
} 

그러나 이것은 작동하지 않는다. 이 테스트는 기능을 변경하지 않고 통과합니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+2

미안하지만, 구현 세부 사항을 테스트하는 이유는 무엇입니까? – Robert

답변

5

캐싱은 Do (ing) Stuff와 직각으로 보입니다. SomeDependency를 변경하거나 어떻게 든 래핑하여 캐싱 로직을 메소드 외부로 가져올 수있는 방법을 찾았습니다. 이제는 람다 표현을 기반으로하는 캐싱 클래스에 대한 멋진 아이디어가 있습니다.

그런 식으로 DoStuff에 대한 테스트를 변경할 필요가 없으므로 새로운 래퍼에서 작동하는지 확인하면됩니다. 그런 다음 SomeDependency 또는 해당 래퍼의 캐싱 기능을 독립적으로 테스트 할 수 있습니다. 잘 설계된 코드를 사용하면 캐싱 레이어를 제자리에 두는 것이 쉽고 의존성이나 구현 모두 차이를 알아야합니다.

단위 테스트는 구현을 테스트해서는 안되며, 동작을 테스트해야합니다. 동시에, 시험중인 피험자는 좁게 정의 된 행동을 가져야한다.

질문에 대답하기 위해 Dynamic Mock을 사용하고 있으며 기본 동작은 구성되지 않은 통화를 허용하는 것입니다. 추가 호출은 "0"을 반환합니다. 당신은 제대로 작동하도록하는 기록/재생 모드를 입력해야 할 수 있습니다

depend.Expect(d => d.GrabValue()).Repeat.Once().Return(1); 
depend.Expect(d => d.GrabValue()).Repeat.Never(); 

: 당신은 더 이상 전화가 의존성에 이루어지지한다는 기대를 설정해야합니다.

+0

좋은 점 : "단위 테스트는 구현을 테스트해서는 안되며, 동작을 테스트해야합니다. 동시에 테스트 대상도 좁은 동작 집합을 가져야합니다." 이 질문에 대한 답변 (제 질문에 대한 Robert의 의견) – jpoh

4

"테스트가 설계를 유도합니다"의 경우와 같습니다. 캐싱이 SubDependency의 구현 세부 사항이므로 직접 테스트 할 수 없다면 아마도 일부 기능 (특히 캐싱 동작)이 노출 될 필요가있을 것이며 SubDependency 내에서 캐싱을 자연스럽지 않게 나타내야하므로 다른 클래스에서 노출되었습니다 ("캐시"라고 함). 물론 Cache에서는 행동이 계약 적 (public)이므로 테스트 할 수 있습니다.

그래서 테스트와 냄새가 우리에게 새로운 수업이 필요하다고 말하고 있습니다. 테스트 중심 설계. 대단하지 않아?

관련 문제