คุณทำไม่ได้ และตัวอย่างของคุณเองนั้นเหมาะอย่างยิ่งที่จะแสดงว่าทำไมถึงไม่
คุณต้องการส่งอีเมลใช่ไหม ดังนั้นคุณจึงสร้างคลาสสแตติกที่CommunicationUtilities
มีสแตติกSendEmail()
อยู่ในนั้น คุณใช้วิธีนี้จากบางคลาสที่ทำสิ่งต่าง ๆ มากมายเช่นรีเซ็ตรหัสผ่านของผู้ใช้และส่งใหม่ทางอีเมล สมบูรณ์
ตอนนี้จะเกิดอะไรขึ้นถ้าคุณต้องการทดสอบหน่วยการเรียนของคุณ คุณทำไม่ได้เพราะทุกครั้งที่คุณต้องการทดสอบวิธีการตั้งรหัสผ่านใหม่มันจะเปลี่ยนฐานข้อมูล (ซึ่งไม่เหมาะสำหรับการทดสอบหน่วย) และยิ่งกว่านั้นจะส่งอีเมล (ยิ่งแย่ลง)
คุณอาจได้อ่านเกี่ยวกับ Inversion of Control ซึ่งมีประโยชน์ในการทำให้การทดสอบหน่วยง่ายขึ้น บทความเกี่ยวกับ IoC จะอธิบายให้คุณทราบว่าแทนที่จะทำสิ่งที่ชอบ:
void ResetPassword(UserIdentifier userId)
{
...
new MailSender().SendPasswordReset(userMail, newPassword);
}
คุณทำ:
void ResetPassword(IMailSender sender, UserIdentifier userId)
{
...
sender.SendPasswordReset(userMail, newPassword);
}
ซึ่งอนุญาตให้ใช้ mocks และ stubs
พยายามที่จะใช้ IoC CommunicationUtilities
ที่คุณ ใช่คุณทำไม่ได้ นั่นเป็นสาเหตุที่ทำให้มันพัง