2010-04-09 5 views
1

나는에 따라 값을 반환 코뿔소 모의 객체와 스텁을 설정하기 위해 노력하고있어 전달 된 인수의 매개 변수는 코뿔소 모의 객체로 인수에서 복잡한 데이터 형식을 반환

예 :.

//Arrange 
var car = new Car(); 
var provider= MockRepository.GenerateStub<IDataProvider>(); 
provider.Stub(
    x => x.GetWheelsWithSize(Arg<int>.Is.Anything)) 
    .Return(new List<IWheel> { 
       new Wheel { Size = ?, Make = Make.Michelin }, 
       new Wheel { Size = ?, Make = Make.Firestone } 
      }); 

car.Provider = provider; 

//Act 
car.ReplaceTires(); 

//Assert that the right tire size was used when replacing the tires 

문제는 제가 휠이 올바른 크기라는 것을 나중에 실제로 주장하기 때문에 크기가 메서드에 전달 된 것이기를 바랍니다. 이는 데이터 제공자가 내가 쓴 이후 명백하게 작동한다는 것을 증명하는 것이 아니라 정확한 크기가 전달되었음을 증명하는 것입니다.

어떻게하면됩니까?

답변

1

"이 데이터 공급자가 작동하는지 증명하기 위해 ... 오히려 정확한 크기는 것을 증명하지 않는 것입니다 통과했다. "

이 특수한 경우에는 잘 작동하는지 잘 모르겠지만 일반적으로 스텁을 통해 이러한 종류의 것들을 간접적으로 테스트하는 것이 가장 쉽습니다.

스텁 된 호출의 출력을 검사하는 대신 명시 적으로 스텁의 인수를 지정한 다음 반환 된 실제 값과 관계없이 반환 값이 예상대로 사용되었는지 확인하십시오. 그렇다면 스텁이 올바르게 호출되었음을 알 수 있습니다. 이 방법이 경우에 당신을 위해 작동하지 않는 경우

//Arrange 
var wheels = new List<IWheel>(); 
const int wheelSize = 17; 
var car = new Car(); 
car.WheelSize = wheelSize; 
var provider= MockRepository.GenerateStub<IDataProvider>(); 
provider 
    .Stub(x => x.GetWheelsWithSize(wheelSize)) 
    .Return(wheels);  
car.Provider = provider; 

//Act 
car.ReplaceTires(); 

//Assert that the right-sized wheels from the provider were 
//used when replacing the tires 
Assert.That(car.Wheels, Is.SameAs(wheels)); 

당신은 WhenCalled to inspect the call arguments and/or modify the return value를 사용할 수 있습니다.

provider 
    .Stub(x => x.GetWheelsWithSize(Arg<int>.Is.Anything)) 
    .WhenCalled(x => x.ReturnValue = CreateWheelsOfSize((int) x.Arguments[0])); 

이 경우 CreateWheelsOfSize (int)는 휠 목록을 생성합니다.

희망이 도움이됩니다.

+0

@David WhenCalled는 내가 취해야하는 정확한 접근 방식이었습니다. 인수를 통해 모의문을 전달한 다음 나중에 검증 할 수 있습니다. Return 기능을 사용하지 않고도 WhenCalled 기능을 사용할 수있는 방법이 있거나 아니면 어쨌든 여러 기능을 통합하여 사용하는 것이 좋을 것입니다. – Joseph

+0

@Joseph, WhenCalled/Return을 사용하지 않아도되는 가장 쉬운 대안은 Arg .Is.Anything을 사용하는 대신 GetWheelsWithSize로 전달되는 값을 제어한다는 것입니다. 그러므로 내 답변에서 첫 번째 제안입니다. 값을 얻을 수 없다면 리팩토링 할 가치가있어 논리가 분리되고 단위 테스트 할 수 있습니다. –

1

동적 반환 값을 얻으려면 Do() 기능을 사용할 수 있습니다. 예를 들어 : 귀하의 경우

[Test] 
public void DynamicallyFakeReturnValue() 
{ 
    var calculatorStub = MockRepository.GenerateStub<ICalculator>(); 
    calculatorStub.Stub(address => address.AddOne(Arg<int>.Is.Anything)) 
     .Do((Func<int, int>) (x => x - 1)); 

    Assert.That(calculatorStub.AddOne(1), Is.EqualTo(0)); 
} 

는 아마있을 것입니다 :

provider.Stub(
    x => x.GetWheelsWithSize(Arg<int>.Is.Anything)) 
    .Do((Func<int, List<IWheel>>) (size => new List<IWheel> { 
       new Wheel { Size = size, Make = Make.Michelin }, 
       new Wheel { Size = size, Make = Make.Firestone } 
      })); 
관련 문제