วิธีการจำลอง Moq โดยไม่ระบุพารามิเตอร์อินพุต


138

ฉันมีรหัสบางอย่างในการทดสอบโดยใช้ Moq:

public class Invoice
{
    ...

    public bool IsInFinancialYear(FinancialYearLookup financialYearLookup)
    {
        return InvoiceDate >= financialYearLookup.StartDate && InvoiceDate <= financialYearLookup.EndDate;
    }
    ...
}

ในการทดสอบหน่วยฉันพยายามล้อเลียนวิธีนี้และทำให้มันกลับมาเป็นจริง

mockInvoice.Setup(x => x.IsInFinancialYear()).Returns(true);

IsInFinancialYearอย่างไรก็ตามมีการเขียนบรรทัดนี้ดังนั้นผมจึงไม่ได้มีการระบุการป้อนข้อมูลเพื่อ กล่าวคือ. ดังนั้นมันจึงไม่อยู่ในโค้ดว่าพารามิเตอร์อินพุตคืออะไรมันจะคืนค่าจริงตามที่ส่งผ่านไป?

คำตอบ:


233

คุณสามารถใช้It.IsAny<T>()เพื่อจับคู่ค่าใดก็ได้:

mockInvoice.Setup(x => x.IsInFinancialYear(It.IsAny<FinancialYearLookup>())).Returns(true);

ดูส่วนการจับคู่อาร์กิวเมนต์ของการเริ่มต้นอย่างรวดเร็ว


6
ฉันรู้ว่าคำตอบนี้เก่า แต่ถ้าฉันมีพารามิเตอร์ง่ายๆมากกว่าหนึ่งตัวล่ะ? เป็นไปได้ไหมที่จะพูดว่า "อะไรก็ได้ที่ประเภทเหมาะสมกับพารามิเตอร์ทั้งหมด"
Brandon

6
@ แบรนดอนจากนั้นคุณมี It.IsAny <type> () สำหรับแต่ละพารามิเตอร์โดยที่ type คือประเภทใดก็ตามที่ param หากคุณต้องการคุณอาจเขียนฟังก์ชันตัวช่วยที่ทำสิ่งนี้ให้คุณผ่านการสะท้อนกลับ
user441521


5
เห็นด้วยกับความคิดเห็นอื่น ๆ ที่นี่: การพิมพ์สิ่งนี้สำหรับวิธีการใด ๆ ที่ไม่สำคัญเป็นความเจ็บปวดที่สำคัญ
John Hargrove

มีใครบ้างที่มีตัวช่วยที่ทำเช่นนี้? หรือคุณต้องเขียนตัวช่วยแต่ละวิธี /
Meysam

18

ลองใช้It.IsAny<FinancialYearLookup>()เพื่อยอมรับข้อโต้แย้งใด ๆ :

mockInvoice.Setup(x => x.IsInFinancialYear(It.IsAny<FinancialYearLookup>())).Returns(true);

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.