2012-11-21 26 views
42

Bir sınıf olan bir parametreyi doğrulamaya çalışıyorum. Test edilen kod gayet iyi. Hata testte.Moq nesne parametresiyle doğrulayın

Her ikisi de başarısız olan iki yöntemi denedim. İkinci parametre olarak geçirilen bir nesne eşit özelliklere sahip olsa da,

this.MockImageResizeFilter.Verify(m => m.Filter(this.UploadedFileData, new ImageFilterOptions() 
    { 
     Width = 256, 
     Height = 256, 
    })); 

her zaman başarısız Bu:

1: Burada

benim girişimlerdir. İlk parametre doğrulanmış.

2:

this.MockImageResizeFilter.Setup(m => m.Filter(It.IsAny<byte[]>(), It.IsAny<ImageFilterOptions>())) 
    .Callback<byte[], ImageFilterOptions>((data, options) => 
     { 
      Assert.AreEqual(this.UploadedFileData, data, "data"); 
      Assert.AreEqual(filterOptions.Width, options.Width, "Width"); 
      Assert.AreEqual(filterOptions.Height, options.Height, "Height"); 
     } 
    ); 

Bu her zaman geçer, bu başarısız olması gerekir bile. Geri aramadaki Asıllar başarısızdır, ancak istisna dış çerçeveye geçmez ve bu nedenle test her zaman geçer.

Neyi yanlış yaptığımı bulmama yardım edebilir misiniz?

cevap

66

İlk girişim, elde etmek istediğiniz şeylere daha yakındır.

başarısız nedeni Moq (muhtemelen) yöntemi ile çağrıldı ImageFilterOptions parametre Verify çağrısında sağlanan olarak aynı örnek olup olmadığını test etmek kapağının altında Object.Equals kullanmasıdır.

Bunların aynı örnek olması mümkün değildir, çünkü Verify içinde bir new ImageFilterOptions() oluşturun.

Parametre yerine bu şekilde kontrol edin, parametrenin doğrulanması beklenen bir ifade sağlamak için Moq's It.Is sözdizimini kullanabilirsiniz. Senin durumunda

, parametre türü ImageFilterOptions ait olduğunu ve her iki Width ve Height 256 ayarlı olup olmadığını kontrol etmek istiyorum. Bunu sağlayan ifadesidir:

It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256) 

Yani, Verify için çağrı aşağıdaki gibi görünebilir:

this.MockImageResizeFilter.Verify(m => m.Filter(
      this.UploadedFileData, 
      It.Is<ImageFilterOptions>(p => p.Width == 256 && p.Height == 256))); 
+0

Noktası, sayesinde! – rhughes

+1

Kullanmam gereken sözdizimi şöyle olurdu: 'It.Is ((ImageFilterOptions p) => p.Width == 256 && p.Height == 256)'. Genel bir 'Hayır' oldu – Nemo1024

+0

Genel sürümü benim için çalışıyor ve API belgelerinde http://www.nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - siz misiniz? Aralığın güncel bir sürümünü kullanma? –