เรากำลังใช้StructureMapในโครงการพัฒนาซอฟต์แวร์ใหม่ หนึ่งในสมาชิกในทีมได้ใช้การทดสอบหน่วยที่โดยทั่วไปแล้วทดสอบการกำหนดค่าคอนเทนเนอร์ของStructureMap ทำได้โดยทำสิ่งต่อไปนี้
- นับจำนวนอินสแตนซ์ของแอสเซมบลีที่กำหนดค่าสำหรับคลาสใน namespace ของแอปพลิเคชันของเรา
- กำหนดอินสแตนซ์ที่คาดหวังในระดับชั้นเรียน
- ยืนยันว่าอินสแตนซ์ที่คาดหวังตรงกับอินสแตนซ์ที่พบทั้งหมด
- ยืนยันว่าอินสแตนซ์ที่คาดหวังตรงกับที่กำหนดไว้ในการทดสอบ
ตัวอย่างของสิ่งนี้คือ;
var repositories = container.GetAllInstances<IEnvironmentRepository>();
Assert.AreEqual(1, repositories .Count());
foundInstances = foundInstances + repositories .Count();
นอกจากนี้เรายังมี 'การทดสอบหน่วย' สำหรับคลาสต่อไปนี้
public MyClass(IEnvironmentRepository environmentRepository)
{
}
ในการทดสอบเหล่านี้เราเยาะเย้ย IEnvironmentRepository ดังนั้นจะไม่ถูกฉีดจากภาชนะที่จะเกิดขึ้นในระบบสด
เพื่อนร่วมงานเพิกเฉยต่อการทดสอบหน่วยในการกำหนดค่าโครงสร้างแผนผังพร้อมแสดงความคิดเห็นตามแนว "การทดสอบหน่วยเท่านั้นทดสอบการกำหนดค่าของตัวเอง" เห็นได้ชัดว่านี่คือจุดประสงค์ของการทดสอบและในความคิดของฉันก็ใช้ได้อย่างสมบูรณ์แบบ ฉันถามคนที่ไม่สนใจการทดสอบเพื่อลบการกำหนดค่าโครงสร้างแผนผังสำหรับIEnvironmentRepository
(ด้วยการทดสอบยังคงถูกละเว้น) และเรียกใช้ชุดทดสอบเต็มหน่วยพวกเขาทั้งหมดผ่าน จากนั้นเราก็เรียกใช้แอปพลิเคชันและล้มลงเพราะการกำหนดค่าคอนเทนเนอร์ไม่ถูกต้อง ในความเห็นของฉันสิ่งนี้ได้พิสูจน์คุณค่าของการทดสอบแล้วเพื่อนร่วมงานของฉันยังไม่เห็นด้วย เขากล่าวเพียงว่าเราไม่ควรทำการทดสอบการกำหนดค่า แต่ฉันคิดว่านี่เป็นสิ่งที่ดีในการทดสอบหน่วย
ดังนั้นคำถามมากมาย
- เป็นการทดสอบหน่วยที่ถูกต้อง - เรากำลังทดสอบการกำหนดค่าของคอนเทนเนอร์ของเราไม่ใช่ structuremap นั้นใช้งานได้ (แต่ฉันเห็นการทับซ้อนกัน)
- หากไม่เป็นเช่นนั้นคุณจะตรวจสอบความถูกต้องของการกำหนดค่าโดยไม่ทำการทดสอบได้อย่างไร คุณจะหยุดบางคนตั้งใจลบบรรทัดของรหัสที่ต้องการและตรวจสอบได้อย่างไร
- การ
MyClass
ทดสอบหน่วยควรแก้ไขอินสแตนซ์ของIEnvironmentRepository
จากคอนเทนเนอร์และส่งผ่านสิ่งนี้หรือไม่