ส่งคืนค่าที่ส่งผ่านไปยังเมธอด


390

ฉันมีวิธีการบนอินเตอร์เฟส:

string DoSomething(string whatever);

ฉันต้องการเยาะเย้ยนี้ด้วยขั้นต่ำเพื่อให้มันส่งคืนสิ่งที่ผ่านไป - สิ่งที่ต้องการ:

_mock.Setup( theObject => theObject.DoSomething( It.IsAny<string>( ) ) )
   .Returns( [the parameter that was passed] ) ;

ความคิดใด ๆ

คำตอบ:


526

คุณสามารถใช้แลมบ์ดากับพารามิเตอร์อินพุตได้เช่น:

.Returns((string myval) => { return myval; });

หรืออ่านได้มากขึ้นเล็กน้อย:

.Returns<string>(x => x);

1
ดูเหมือนว่าค่อนข้างง่ายจนกว่าคุณจะต้องทำเช่นนี้สำหรับวิธีการที่มี7 ข้อโต้แย้ง ... เมื่อผมตรวจสอบIReturnsในขั้นต่ำจะกำหนดReturnsสำหรับ4 ข้อโต้แย้งที่มากที่สุด มีวิธีง่ายๆในการหลีกเลี่ยงสิ่งเหล่านี้หรือไม่? / ฉันหมายถึงยกเว้นการแก้ไขแหล่งที่มาของ Moq /
mizuki nakeshu

14
ok ก็กำหนดได้ถึง9 ข้อโต้แย้งในโวลต์Moq 4.0.0.0แก้ไขแล้ว :)
mizuki nakeshu

14
@mizukinakeshu ฉันจะพิจารณาผู้สร้างใหม่ในวิธีการโต้แย้ง 9 เนื่องจากดูเหมือนว่าคลาส / วิธีการทำมากเกินไป บางทีการปรับโครงสร้างพารามิเตอร์ 9 ครั้งให้เป็นคลาสการตั้งค่าหรือโครงสร้างเพื่อช่วยคุณในภายหลัง
สมาชิกวุฒิสภา

@TheSenator เห็นด้วยฉันไม่ได้เรียกคืนสิ่งที่เกิดขึ้นแล้ว แต่ฉันเดาว่าฉันเพิ่งแฮ็คการทดสอบหน่วยร่วมด้วยกันสำหรับรหัสที่มีอยู่แล้วที่ฉันไม่ได้แก้ไขมิฉะนั้นอาร์กิวเมนต์จำนวนนี้เรียกร้องให้มีการเปลี่ยน
mizuki nakeshu

27
แค่ทราบเช่นนี้ฉันสับสน: สตริงใน.Returns<string>หมายถึงพารามิเตอร์การป้อนข้อมูลและไม่ใช่ค่าที่คุณจะกลับมา
Jim

241

มีประโยชน์มากยิ่งขึ้นหากคุณมีพารามิเตอร์หลายตัวคุณสามารถเข้าถึง / พารามิเตอร์ทั้งหมดด้วย:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(),It.IsAny<string>(),It.IsAny<string>())
     .Returns((string a, string b, string c) => string.Concat(a,b,c));

คุณต้องอ้างอิงอาร์กิวเมนต์ทั้งหมดเสมอเพื่อให้ตรงกับลายเซ็นของวิธีแม้ว่าคุณจะใช้เพียงหนึ่งในนั้น


17
นี่ควรเป็นคำตอบที่ยอมรับได้ นี่คือสิ่งที่คุณต้องทำ สิ่งอื่นใดโยนข้อยกเว้น "จำนวนข้อโต้แย้งที่คาดหวัง"
ไคม์เอลียาห์

ใช่แน่นอนจัดสรรง่ายต่อการอ่านและทำงานด้วยReturnsAsyncเช่นกัน!
Piotr Kula

1
คำตอบนี้ช่วยได้ทั้งวัน หมายเหตุ (ผู้อ่านในอนาคต) คุณสามารถนำไปเพิ่มเติมอีกเล็กน้อยเช่นกัน . Return ((สตริง a, สตริง b, สตริง c) => {string d = "wow"; ส่งคืนสตริง Concat (a, b, c, d);});
granadaCoder

1
โดยส่วนตัวนี่เป็นคำตอบที่ดีกว่ามาก ฉันมีความรู้เกี่ยวกับ Moq น้อยมาก แต่ก็ยังเข้าใจได้ทันที
unrealsoul007

สำหรับวิธีการคืนค่าเป็นโมฆะฉันใช้. Callback ((string a, Exception b, string c) => ส่งข้อยกเว้นใหม่ (b.Message));
tymtam

62

Returns<T>วิธีการทั่วไปสามารถจัดการกับสถานการณ์นี้ได้อย่างดี

_mock.Setup(x => x.DoSomething(It.IsAny<string>())).Returns<string>(x => x);

หรือถ้าวิธีนั้นต้องการอินพุตหลายตัวให้ระบุดังนี้:

_mock.Setup(x => x.DoSomething(It.IsAny<string>(), It.IsAny<int>())).Returns((string x, int y) => x);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.