Moq nesne parametresi ile doğrulama


86

Sınıf olan bir parametreyi doğrulamaya çalışıyorum. Test edilen kod iyi. Hata test aşamasındadır.

Her ikisi de başarısız olan iki yöntemi denedim.

İşte girişimlerim:

1:

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

İkinci parametre olarak iletilen bir nesne eşit özelliklere sahip olsa bile bu her zaman başarısız olur. İlk parametrenin iyi olduğu doğrulandı.

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, başarısız olması gerektiğinde bile her zaman geçer. Geri aramadaki Savlar başarısız olur, ancak istisna dış bağlama geçirilmez ve bu nedenle test her zaman geçer.

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

Yanıtlar:


139

İlk girişim, ulaşmak istediğiniz şeye daha yakındır.

Başarısız olmasının nedeni, Moq'un (muhtemelen) , yöntemin çağrıldığı parametrenin, çağrıda sağladığınız örnekle aynı örnek Object.Equalsolup olmadığını test etmek için kapağın altında ImageFilterOptionskullanmasıdır Verify.

Onların aynı örnek olması imkansızdır, çünkü Verifysizde bir new ImageFilterOptions().

Parametre denetimini bu şekilde gerçekleştirmek yerine, parametrenin It.Isbeklenen bir ifade olduğunu doğrulayan bir ifade sağlamak için Moq'un sözdizimini kullanabilirsiniz .

Sizin durumunuzda, parametrenin türde ImageFilterOptionsolup olmadığını ve hem Widthve hem de Heightdeğerinin olarak ayarlandığını kontrol etmek istersiniz 256. Bunu yapmanıza izin veren ifade şudur:

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

Yani, aramanız Verifyşöyle görünebilir:

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

1
Ben kullanım zorunda olduğu sözdizimi olacaktır: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). Jenerik yoktuIs
Stanislav

1
Genel sürüm benim için çalışıyor ve nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) API belgelerinde bulunuyor - Moq'un güncel olmayan bir sürümünü mü kullanıyorsunuz?
Tim Abell
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.