2012-01-16 15 views
30

Sahte içindeki bir yöntemin beklenen nesne parametresiyle çağrıldığını doğrulamaya çalışıyorum. Moq, nUnit kullanıyorum ve AutoFixture'ın benzerliğinin işi bitirmesi gerektiğini düşünüyorum. Aşağıda, yapmaya çalıştığım şeyin basitleştirilmiş bir sürümüdür.Moq mock sınıfında beklenen parametre değerlerini doğrulamak için Doğrulamayı Kullanma

Bunu AutoFixture ile yapmanın bir yolu var mı? Something'un uygun parametreyle çağrıldığını doğrulamanın daha iyi bir yolu var mı? Ancak Doğrusu benim projesinde A gibi her sınıfta Eşittir geçersiz istemem,

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

geçiş:

geçersiz kılma özellik değerlerini karşılaştırabilir ve Verify hattını değişen A sınıfında Eşittir. Varsayılan kontrolleri ile Verify Adedi

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 
     } 
    } 
} 

cevap

45

aynı örneklerini sağlamak zaman sadece geçer böylece bağımsız değişkenler için eşitlik başvuru testlerinizde ve uygulanmasında (eğer Equals overriden yaptıysanız hariç).

expectedA.Value numaralı durumda, DoSomethingWith numaralı örnekte oluşturulmuş aynı örnek olan new A { P1 = 1 } testini yaratmanız yeterlidir.

Sen (sen hiç Autofixture gerekmez bunun için aslında) Equals geçersiz kılma olmadan düzgün Bunu test etmek Moq en It.Is yapısını kullanmak gerekir:

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

Ama P1 gibi birden özelliklere sahip olursa, P2 , P3 ... AutoFixture yararlı olabilir:

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

tüm özellikler için elle eqaulity kontrollerini yazmaya gerek yoktur çünkü.

+2

+1 Özellikle son çözüm, Benzerlik ile doğru yaklaşımdır. Http://autofixture.codeplex.com/workitem/4230 –

+0

Bunu yaptığınız gibi, FWIW, Eşitlik'i geçersiz kılan bir proxy'yi dinamik olarak yayınlayabilmesi için bir işlevsellik için bir işleve sahiptir. ! – jaminto

5

AutoFixture 2.9.1'e (veya daha yeni bir sürüme) yükseltirseniz, hedef türü için dinamik bir proxy gönderecek olan Likeness örneğinde CreateProxy yöntemini çağırabilirsiniz.

Oluşturulan dinamik proxy geçersiz kılar, sözdizimini basitleştiren Benzerlik'i kullanır (oldukça fazla). o da test iddiasını çok daha spesifik Herhangi örneği kabul etmektense yapar

[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 
} 

Not:

İşte Likeness proxy kullanacak şekilde modifiye orijinal test yöntemidir.

Bu yeni özellik hakkında daha fazla bilgiyi here bulabilirsiniz.