2014-04-07 6 views
0

단일 메소드 인터페이스의 여러 구현을 취하여 차례대로 실행하는 메소드가 있습니다. 이들 각각은 어떤 식 으로든 ValueType을 돌연변이시킵니다. 스텁 알 수없는 입력을 에코하는 함수

public interface IValueTypeMutator 
{ 
    ValueType ModifyValueType(ValueType valueType); 
} 

public class ValueTypeBuilder 
{ 
    public ValueType Create(params IValueTypeMutator[] mutators) 
    { 
     var valueType = new ValueType { X = "SomeConstant" }; 

     return mutators.Aggregate(
      (valueType, mutator) => mutator.ModifyValueType(valueType)); 
    } 
} 

나는 ValueTypeBuilder를 사용하는 클래스를 테스트하고있어, 각 IValueTypeMutator는 스텁 될 것입니다. 초기화 후 내 ValueType의 상태를 유지하기 위해 일부 테스트에서 리턴 값으로 ValueType 입력의 값을 간단히 반향시키기를 원합니다. 때문에 명시 적 Stub() 구현하지 않고

이 필요하다는 스텁의 기본 동작은 이전 Create() 방법 ValueType의 초기화를 덮어 쓸 것이다, null을 반환하는 것입니다. 그러나 ValueType의 초기화에 사용 된 실제 값을 정의하면 테스트가 불필요하게 부서지기 쉽습니다. ValueType의 정확한 초기화는 상태가 유지된다는 점에서 이러한 특정 테스트와 관련이 없습니다.

답변

2

RhinoMocks Do() Handler 여기에 청구서를 기입하십시오. 이 경우

_stubMutator = MockRepository<IValueTypeMutator>(); 
    _stubMutator 
     .Stub(x => x.ModifyValueType(Arg<ValueType>.Is.Anything)) 
     .Do((Func<ValueType, ValueType>) (v => v)); 

ValueType의 정확한 초기화에 관계없이 ValueType의 가치라고 그래서 신원 기능을 보장하기 위해 Arg<ValueType>.Is.Anything을 사용한 테스트의 대상이되지 않습니다.

+0

더 이상 '스텁'이 아니라 '가짜'라고 생각할 수 없습니다. http://stackoverflow.com/a/6808251/1808494 – Aron

+0

'스텁 (Stub)'이 '가짜 (Fake)'가 될 때가 정확히 확실하지는 않습니다. 대신 우리가 Rhino Mock '스텁 (Stub)'에 대해 이야기하고 있다고 가정 해 봅시다. 실제로 Rhino Mock의'Stub' (실제 코드에서는'_stub'가 접두어로 붙지 않습니다)는 Rhino Mocks에서 [AssertWasCalled]에 대한 모의로 사용할 수 있습니다. 'Stub']] (https://raw.githubusercontent.com/JonKruger/RhinoMocksExamples/master/src/RhinoMocksExamples/RhinoMocksTests.cs). 오늘날 대부분의 조롱 프레임 워크가 스텁/모의 구별을하지는 않는 것 같습니다. – jcorcoran

+0

가짜와 스텁 사이의 차이점은 가짜가 인터페이스 또는 클래스의 작동 구현 인 반면 스텁은 MacGuffin이 문학 작품과 매우 흡사하게 사용된다는 것입니다. 이 경우 가짜는 ValueType과 비슷한 것을 반환해야합니다. 스텁은 null을 반환 할 수 있고 반환해야합니다. 스텁의 동작은 테스트에 영향을 미치지 않아야하지만 다른 뮤 테이터와 함께 스텁을 연결 한 경우 분명히 NullException이 발생합니다. – Aron

0

셜리가 실제로 가짜 또는 리얼 IValueTypeMutator을 사용할 수 있다고 생각할 수는 없습니다. 단위 테스트를위한 구체적인 클래스 사용에는 아무런 문제가 없습니다. 이 경우에는 private class FakeValueTypeMutator을 시험 수업에 풀어 놓을 것입니다. 그 일이 훨씬 더 명확합니다.

[TestFixture] 
public ValueTypeBuilderTest 
{ 
    private class FakeValueTypeMutator : IValueTypeMutator 
    { 
     public ValueType ModifyValueType(ValueType valueType) 
     { 
      return valueType; 
     } 
    } 

    //Test code here! 
} 
관련 문제