2012-01-16 4 views
30

모의 객체 내의 메소드가 예상 객체 매개 변수와 함께 호출되는지 확인하려고합니다. Moq, nUnit을 사용하고 있으며 AutoFixture의 닮은 점이 작업을 완료해야한다고 생각합니다. 아래는 내가하려는 일의 단순화 된 버전입니다.확인을 사용하여 Moq mock 클래스의 예상 매개 변수 값을 확인하십시오.

AutoFixture에서이 작업을 수행 할 수있는 방법이 있습니까? 해당 매개 변수로 Something이 호출되는지 확인하는 더 좋은 방법이 있습니까? 그러나 나는 오히려 내 프로젝트에서 같은 모든 클래스에서 같음을 무시하지 않는 게 좋을,

barMock.Verify(m => m.Something(a)); 

패스 :

재정은 속성 값을 비교에 Verify 라인을 변경하기 위해 A 클래스 같음. 기본 검사로 Verify MOQ에서

namespace Test 
{ 
    using Moq; 
    using NUnit.Framework; 
    using Ploeh.SemanticComparison.Fluent; 

    public class A 
    { 
     public int P1 { get; set; } 
    } 
    public interface IBar 
    { 
     void Something(A a); 
    } 

    public class Foo 
    { 
     public A Data { get; private set; } 
     public void DoSomethingWith(IBar bar) 
     { 
      Data = new A { P1 = 1 }; 
      bar.Something(Data); 
     } 
    } 

    [TestFixture] 
    public class AutoFixtureTest 
    { 
     [Test] 
     public void TestSample() 
     { 
      var foo = new Foo(); 
      var barMock = new Mock<IBar>(); 
      var a = new A { P1 = 1 }; 
      var expectedA = a.AsSource().OfLikeness<A>(); 

      foo.DoSomethingWith(barMock.Object); 

      expectedA.ShouldEqual(foo.Data); // passes 
      barMock.Verify(m => m.Something(expectedA.Value)); // fails 
     } 
    } 
} 

답변

45

는 같은 인스턴스를 제공 할 때 단지 통과하도록 인수에 대한 평등을 참조하여 테스트 및 구현에 (당신이 Equals 오버라이드 (override) 한 경우는 제외).

expectedA.Value은 테스트에서 생성 된 new A { P1 = 1 }을 반환하며 이는 물론 DoSomethingWith에서 생성 된 동일한 인스턴스가 아닙니다.

당신은 (당신이 모든 Autofixture 필요하지 않습니다이에 대한 사실) Equals을 무시하지 않고 제대로이 테스트 MOQ의 It.Is 구조를 사용해야합니다 :

barMock.Verify(m => m.Something(It.Is<A>(arg => arg.P1 == a.P1))); 

을하지만 P1과 같은 여러 속성이있는 경우, P2 , P3 ... AutoFixture 유용 할 수 있습니다 :

barMock.Verify(m => m.Something(It.Is<A>(arg => expectedA.Equals(a)))); 

모든 특성에 대해 수동으로 eqaulity 검사를 작성할 필요가 없습니다 때문입니다.

+2

+1 특히 마지막 해결 방법은 유사성을 가진 올바른 접근법입니다. FWIW에는 Equence를 오버라이드하는 프록시를 동적으로 생성 할 수있게하기 위해 Likeness의 새로운 기능을위한 작업 항목이 있습니다. 위의 구문을 크게 단순화합니다. http://autofixture.codeplex.com/workitem/4230 –

+0

감사합니다. ! – jaminto

5

AutoFixture 2.9.1 이상으로 업그레이드하면 대상 유형에 대한 동적 프록시를 방출하는 Likeness 인스턴스에서 CreateProxy 메소드를 호출 할 수 있습니다.

생성 된 동적 프록시는 구문을 단순화하는 유사성을 사용하여 같음을 오버라이드합니다 (상당 부분). 또한 시험 어서 훨씬 더 특정 않음 인스턴스 접수보다 만드는

[Test] 
public void TestSample() 
{ 
    var foo = new Foo(); 
    var barMock = new Mock<IBar>(); 
    var expected = new A().AsSource().OfLikeness<A>().CreateProxy(); 
    expected.P1 = 1; 

    foo.DoSomethingWith(barMock.Object); 

    Assert.True(expected.Equals(foo.Data));  // passes 
    barMock.Verify(m => m.Something(expected)); // passes 
} 

참고

여기서 비슷 프록시를 사용하도록 수정 된 원래의 시험 방법이다.

이 새로운 기능에 대한 자세한 내용은 here을 참조하십시오.