ในฐานะเพื่อนร่วมงานบล็อกของฉันใน. NET Mocking Frameworks และวิธีการทำงานที่เก็บนี้พยายามที่จะใช้การทดสอบหน่วยเดียวกันกับการเยาะเย้ยโดยใช้กรอบการเยาะเย้ยหลักแต่ละอันสำหรับ. NET
โครงการนี้มีวัตถุประสงค์เพื่อเป็นข้อมูลอ้างอิงสำหรับทุกคนที่ต้องการเปรียบเทียบกรอบการเยาะเย้ย. NET หรือดูตัวอย่างไวยากรณ์สำหรับเฟรมเวิร์กที่กำหนด มันไม่ได้มีวัตถุประสงค์เพื่อเป็นข้อมูลอ้างอิงที่ครบถ้วนสมบูรณ์ไม่ใช่ว่ามันจะปราศจากข้อผิดพลาด (แต่โปรดแจ้งให้เราทราบหากคุณพบปัญหาใด ๆ )
ในการเขียนการทดสอบเราต้องการรหัสบางอย่างที่ต้องการการทดสอบ ดังนั้นฉันได้สร้าง LunchNotifier ซึ่งเป็นคลาสที่มีความหนาแน่นน้อยกว่า Hello-World ซึ่งสามารถเขียนการทดสอบหน่วย (พร้อม mocks) ได้
หนึ่งในประโยชน์ที่ได้รับจากการสแต็กล้น Emplpoyees ที่ทำงานในสำนักงานนิวยอร์กคืออาหารกลางวันฟรีจากพ่อครัวในบ้าน ทุกวันเมื่อพ่อครัวเสร็จสิ้นการเตรียมอาหารการแจ้งเตือนจะออกไปหาพนักงานในสำนักงานเพื่อแจ้งให้พวกเขาทราบว่ามีอาหาร
ในโครงการ CodeBeingTested คลาส LunchNotifier เป็นเป้าหมายหลักของเรา
ชั้นเรียนนี้มีการพึ่งพาภายนอกห้าครั้งที่ต้องล้อเลียนเพื่อทำการทดสอบของเรา:
INotificationService (ฉีดผ่านตัวสร้าง)ILogger (ฉีดผ่านตัวสร้าง)IEmployeeService (ฉีดผ่านตัวสร้าง)IEmployee ) ที่อยู่ในสำนักงานนิวยอร์กIEmployee (ส่งคืนจาก IEmployeeService )System.DateTime ตรรกะหลักอยู่ใน LunchNotifier.SendLunchtimeNotifications() วิธีนี้รวมถึงการเรียกแบบอินไลน์ไปยัง System.DateTime.Now ซึ่งไม่สามารถเยาะเย้ยได้โดยกรอบการทำงานเช่น Moq หรือ Rhinomocks:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
การใช้งานทางเลือกมีให้สำหรับการใช้งานโดยเฟรมที่ถูกควบคุมใน LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() ซึ่งการโทรไปยัง DateTime.Now ได้ถูกแยกออกเป็นวิธีการของตัวเองซึ่งสามารถแทนที่ด้วยการเยาะเย้ย:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
แต่ละโครงการที่เหลือพยายามใช้ชุดการทดสอบหน่วยที่คล้ายกันกับผู้ LunchNotifier โดยใช้กรอบการเยาะเย้ยที่แตกต่างกัน
การทดสอบทั้งหมดเขียนขึ้นโดยใช้ NUNIT v3.10 ผ่านแพ็คเกจ NUGET
ในบางกรณีมีหลายวิธีในการทดสอบโดยใช้กรอบการเยาะเย้ยดังนั้นฉันจึงได้ให้การทดสอบหลายรูปแบบเพื่อแสดงวิธีการที่แตกต่างกัน
การทดสอบนี้สร้างพนักงานจำลอง "บ๊อบ" ที่ชอบการแจ้งเตือนทางอีเมลและใช้การจำลองเพื่อให้แน่ใจว่าตรรกะ LunchNotifier จะส่งอีเมลถึงเขาเมื่ออาหารกลางวันพร้อม
การทดสอบนี้สร้างพนักงานเยาะเย้ยสองคน "บ๊อบ" และ "มาร์ธา" และทำให้มั่นใจว่าหากส่งการแจ้งเตือนไปยังหนึ่งในนั้นส่งผลให้เกิดข้อผิดพลาดในการบันทึกและไม่ป้องกันไม่ให้พนักงานที่เหลือได้รับแจ้ง
การทดสอบนี้ใช้ไวยากรณ์ TestCase ของ NUNIT เพื่อเรียกใช้สองกรณีทดสอบหนึ่งกรณีก่อน 13.00 น. และอีกหนึ่งหลังเวลา 13.00 น. เพื่อให้แน่ใจว่าเทมเพลตการแจ้งเตือนที่เหมาะสมจะใช้ตามเวลาของวัน
สำหรับเฟรมเวิร์กที่ไม่มีข้อ จำกัด DateTime.Now สามารถควบคุมได้โดยตรงเพื่อส่งคืนเวลาอินพุตของการทดสอบอย่างไรก็ตามเฟรมเวิร์กที่มีข้อ จำกัด ไม่สามารถทำได้ดังนั้นพวกเขาจึงต้องแยกการโทรไปยัง DateTime.Now นี้เป็นวิธีการหมุนและปรับเปลี่ยนพฤติกรรมของวิธีการใหม่แทน ดังนั้นความจำเป็นสำหรับตัวแปร SendLunchtimeNotifications_DateTimeSeam
ประเภท: ข้อ จำกัด
โครงการ: https://github.com/moq/moq4/wiki/quickstart
NUGET: https://www.nuget.org/packages/moq/
ประเภท: ข้อ จำกัด
โครงการ: https://github.com/hibernating-rhinos/rhino-mocks
NUGET: https://www.nuget.org/packages/rhinomocks
คำเตือน: Rhinomocks เป็นโครงการที่ตายแล้วอย่างมีประสิทธิภาพและจะไม่ให้การสนับสนุนสำหรับการเปลี่ยนแปลงในอนาคตใน. NET เช่น. NET Core ฉันไม่แนะนำให้คุณเริ่มใช้เฟรมเวิร์กนี้หากคุณยังไม่ได้ใช้งาน
ในการเรียกใช้การทดสอบเหล่านี้คุณต้องติดตั้ง VS2017 Enterprise (หรือ Equiv)
ประเภท: ข้อ จำกัด
โครงการ: http://nsubstitute.github.io/
NUGET: https://www.nuget.org/packages/nsubstitute
ประเภท: ไม่มีข้อ จำกัด
Microsoft Fakes มาเป็นส่วนหนึ่งของ Visual Studio 2017 Enterprise หรือ Visual Studio 2015 Ultimate และไม่สามารถใช้เป็นส่วนประกอบได้
Fakes ไม่สนับสนุนการตรวจสอบรูปแบบ AssertWasCalled โดยธรรมชาติดังนั้นฉันจึงใช้แพ็คเกจ Nuget เพิ่มเติม (ซึ่งฉันได้สนับสนุน) เพื่อให้คุณลักษณะนั้น: fakes.contrib / nuget
ประเภท: ไม่มีข้อ จำกัด
ข้อมูลผลิตภัณฑ์: https://www.typemock.com/isolator
ผลิตภัณฑ์นี้ต้องการใบอนุญาตที่ต้องชำระเงิน (มีการทดลองใช้ฟรี 15 วัน) เพื่อทำการเยาะเย้ยที่ไม่มีข้อ จำกัด Typemock นั้นดีพอที่จะให้ใบอนุญาตชุมชนฟรีแก่ฉันเพื่อที่ฉันจะได้ทำงานในโครงการเช่นนี้