2012-12-06 4 views
0

FakeItEasy를 사용하면 통화가 어떻게 발생했는지 주장하는 방법은 무엇입니까?FakeItEasy로 전화를 선택하는 법

사용 사례는 저장소와 함께 작동하는 클래스를 작성 중이며 메소드의 결과로 클래스는 DeleteAll을 호출하거나 Delete를 모두 호출하여 저장소에서 일부 요소를 제거해야합니다 .

는 지금,이 같은 시도 - 캐치를 사용했습니다 :

try // either 
{ 
    A.CallTo(() => module.CardRepo.Delete(A<CardData>.That.IsEqualTo(dummy.CardData[0]))).MustHaveHappened(); 
    A.CallTo(() => module.CardRepo.Delete(A<CardData>.That.IsEqualTo(dummy.CardData[1]))).MustHaveHappened(); 
} 
catch (ExpectationException) // or 
{ 
    A.CallTo(() => module.CardRepo.DeleteAll(A<IEnumerable<CardData>>.That.Contains(dummy.CardData[0]))).MustHaveHappened(); 
    A.CallTo(() => module.CardRepo.DeleteAll(A<IEnumerable<CardData>>.That.Contains(dummy.CardData[1]))).MustHaveHappened(); 
} 

하지만 난 그렇게하지 않고 더 많은 선택을 위해 신속 정말 추한 될 것입니다. 더 좋은 방법이 있습니까? FakeItEasy wiki에서 아무 것도 찾을 수 없습니다.

답변

2

다음은 가짜 개체에서 하나 이상의 메서드가 호출되었는지 확인하는 방법의 예입니다.

public interface IBlah 
{ 
    void Delete(int x); 
    int Add(int x, int y); 
    int Subtract(int x, int y); 
} 

public class Something 
{ 
    private readonly IBlah _blah; 

    public Something(IBlah blah) { _blah = blah; } 

    public void DoSomething(int x, int y) 
    { 
     // _blah.Add(x, y); 
     _blah.Subtract(x, y); 
    } 
} 

위는 바로 조각 위

[Fact] 
    public void TestFeature() 
    { 
     var fake = A.Fake<IBlah>(); 
     var something = new Something(fake); 

     something.DoSomething(1, 2); 

     var callResults = Fake.GetCalls(fake).Any(call => 
     { 
      var x = call.GetArgument<int>("x"); 
      var y = call.GetArgument<int>("y"); 
      return call.Method.Name == "Add" || call.Method.Name == "Subtract" 
       && x == 1 && y == 2; 
     }); 

     Assert.True(callResults); 
    } 

위의 매개 변수 X = 1의주는 값을 추가하거나 빼기가 호출 한 두 경우 확인하는 xUnit의 테스트입니다 테스트하는 단지 사소한 시스템 y = 2

1

정직하게 FakeItEasy로이 작업을 수행 할 수 있는지 확실하지 않은 경우 일반적으로 훌륭한 솔루션이 아닌 것에 동의하지만 코드를 '멋지게'만들 수있는 확장 메서드를 작성할 수 있습니다.

내가 정말로 말하고자하는 것은 단위 테스트를 통해 결정 론적 동작을 테스트한다는 것입니다. 따라서 메소드에 대한 입력을 통해 Delete 또는 DeleteAll 호출을 수행해야하는지 여부를 알 수 없습니다. 요점은 이들이 다른 시험으로 분리되어서는 안되는 점입니다. 어쩌면 여기에 당신 사건에 대한 충분한 정보가 없을 것입니다.

+2

+1 의견이 나에게 맞는 것처럼 보입니다. 테스트중인 메소드는 알려진 입력 세트를 기반으로 결정 론적으로 작동해야합니다. 나는 네가 왜 이런 상황에 처하게되었는지 상상하고있다. 아마도 테스트는 예측할 수없는 시작 상태에있는 실제 데이터베이스에서 입력이 오는 기능 테스트 일 것입니다. 왜 어떤 방법이 호출 될지 알지 못했을까요? 아마도 같은 테스트가 두 개 이상의 클래스에 사용되고있을 것입니다. 어느 쪽이든, 단일 방법만을 테스트하고 알려진 시작 조건을 가진 컨텍스트를 만드는보다 집중된 단위 테스트가 필요한 것처럼 보입니다. –

관련 문제