2009-12-14 3 views
2

NMock2.0에 관한 문서에서 알아낼 수없는 질문이 있습니다.NMock -이 params에서 '모든 값'을 기대하십시오. 아니면 내가하지 않아야합니까?

내가 조롱하고 싶은 Save()라는 함수가 있습니다.

Expect.Once.On(dao) _ 
    .Method("Save").With(New Object() {"foo", 1}) 

그러나이 경우에만 전달이 내가이 저장()가이 개 특정 값으로 호출되는 것을 확인하기 위해 쓸 수 있습니다 알고있는 문자열 매개 변수 및 값으로 진수로 ID ..

소요 "foo"와 1이 전달됩니다. 나는 "foo"라는 값을 제어 할 수 있지만, 두 번째 값은 무엇이 될지 모른다. 또는이 테스트에서 적어도 가치가있는 테스트는 신경 쓰지 않습니다.

는 내가 쓸 수 있습니다 알고

Expect.Once.On(dao) _ 
    .Method("Save").WithAnyArguments() 

그러나 이것은 나에게 어떤 가지 인자를 전달 할 수 있습니다; 그래서 저장 인터페이스가 변경되고 나중에 5 개의 매개 변수를 사용하면 내 테스트가 계속 진행됩니다.

적절한 유형의 2 개 매개 변수 만 사용하도록하려면 어떻게해야합니까?

아마도 더 중요한 것은 - 너무 부서지기 쉬운 단위 테스트를 작성하는 것일까 요? 어쩌면 모든 params를 기대하기 위해 코드를 작성해야합니다. 따라서 리팩터링 할 때마다 돌아와서 해당 라인을 변경할 필요가 없습니까? 나는 많은 mock을 사용하는 테스트 케이스가 매우 부서지기 쉽고 언제든지 리펙토링을해야한다는 것을 알게되었다. 나는 그들을 바꿔야 만한다. 아마 여기 mock을 잘못 사용하고 있을까? 이 물건에 아직 꽤 새로운, 그래서 어떤 충고도 크게 감사드립니다.

답변

5

일치하는 값을 사용하지 않고 특정 유형을 일치 시키려면 Is.TypeOf() 정규 표현식을 사용하십시오. 당신이 방법은 지정된 입력 형식의 매개 변수를 처리 할 수 ​​있는지 확인하려는 경우 합리적인지에 대한 여부, 나는이 말 것

Expect.Once.On(dao).Method("Save").With(Is.TypeOf(typeof(string))); 

일반적인 경우에 괜찮 : 당신은 같은 것을 원하는 . 예를 들어 CarVehicle을 예상하는 메서드로 전달한다고 가정 해 보겠습니다. 메서드가 파생 된 형식을 올바르게 처리 할 수 ​​있는지 확인하는 것이 유용 할 것입니다.

+0

감사합니다. 이것이 내 'DAO'객체가 모의 객체로 간주된다는 것을 의미합니까? 왜냐하면 내가 그것에 반대한다고 주장하기 때문입니까? 그렇다면 어떻게 NMock에서 '스텁'을 만들어 어설트없이 코드를 컴파일하게 할 수 있습니까? 그냥 할거야 .WithAnyParameters()? 또는이 함수가 호출되지 않으면 VerifyExpectationsHasBeenMet()이 실패하여 모의 (mock)로 간주됩니까? 그렇다면 파울러 (Fowler)가 정의한 '스텁'을 만드는 법? – dferraro

+0

@dferraro to stubs는'Expect.Once'를'Stub'으로 대체하기 때문에 스텁 된 호출은 VerifyExpectationsHasBeenMet에 포함되지 않습니다. – nolith

2

당신은 간단한 클래스를 만들 수 있습니다 대답에 대한

class DontCare 
{ 
    public override bool Equals(object obj) 
    { 
     return true; 
    } 
} 

Expect.Once.On(dao).Method("Save").With(new DontCare());