Moq ตรวจสอบด้วยพารามิเตอร์วัตถุ


86

ฉันกำลังพยายามตรวจสอบพารามิเตอร์ที่เป็นคลาส โค้ดที่กำลังทดสอบนั้นใช้ได้ จุดบกพร่องอยู่ระหว่างการทดสอบ

ฉันได้ลองสองวิธีซึ่งทั้งสองวิธีล้มเหลว

นี่คือความพยายามของฉัน:

1:

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

สิ่งนี้จะล้มเหลวเสมอแม้ว่าออบเจ็กต์จะส่งผ่านเนื่องจากพารามิเตอร์ที่สองมีคุณสมบัติเท่ากัน พารามิเตอร์แรกได้รับการตรวจสอบแล้ว

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");
        }
    );

สิ่งนี้มักจะผ่านไปแม้ว่ามันจะล้มเหลวก็ตาม Asserts ในการเรียกกลับล้มเหลว แต่ข้อยกเว้นจะไม่ถูกส่งผ่านไปยังบริบทภายนอกดังนั้นการทดสอบจะผ่านไปเสมอ

คุณช่วยค้นหาสิ่งที่ฉันทำผิดได้ไหม

คำตอบ:


139

ความพยายามครั้งแรกใกล้เคียงกับสิ่งที่คุณต้องการบรรลุมากขึ้น

สาเหตุที่ล้มเหลวคือ Moq (อาจ) ใช้Object.Equalsภายใต้ฝาครอบเพื่อทดสอบว่า ImageFilterOptionsพารามิเตอร์ที่เรียกใช้เมธอดนั้นเป็นอินสแตนซ์เดียวกับที่คุณระบุในการโทรVerifyหรือไม่

เป็นไปไม่ได้ที่จะเป็นอินสแตนซ์เดียวกันเพราะVerifyคุณสร้างไฟล์new ImageFilterOptions().

แทนที่จะดำเนินการตรวจสอบพารามิเตอร์ด้วยวิธีนี้คุณสามารถใช้It.Isไวยากรณ์ของ Moq เพื่อระบุนิพจน์ที่ตรวจสอบว่าพารามิเตอร์นั้นเป็นพารามิเตอร์ที่คาดไว้

ในกรณีของคุณคุณต้องการที่จะตรวจสอบว่าพารามิเตอร์เป็นประเภทImageFilterOptionsและว่าทั้งสองWidthและมีการกำหนดให้Height 256นิพจน์ที่ช่วยให้คุณทำได้คือ:

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

ดังนั้นการโทรของคุณVerifyอาจมีลักษณะดังนี้:

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

1
ไวยากรณ์ที่ฉันต้องใช้คือ: It.Is((ImageFilterOptions p) => p.Width == 256 && p.Height == 256). ไม่มีทั่วไปIs
Stanislav

1
เวอร์ชันทั่วไปใช้ได้สำหรับฉันและอยู่ในเอกสาร API nudoq.org/#!/Packages/Moq/Moq/It/M/Is(TValue) - คุณใช้ Moq เวอร์ชันที่ล้าสมัยหรือไม่
Tim Abell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.