ฉันกำลังสรุปส่วนการติดตามประวัติของชั้นเรียนของฉันเพื่อให้มีลักษณะดังนี้:
private readonly Stack<MyObject> _pastHistory = new Stack<MyObject>();
internal virtual Boolean IsAnyHistory { get { return _pastHistory.Any(); } }
internal virtual void AddObjectToHistory(MyObject myObject)
{
if (myObject == null) throw new ArgumentNullException("myObject");
_pastHistory.Push(myObject);
}
internal virtual MyObject RemoveLastObject()
{
if(!IsAnyHistory) throw new InvalidOperationException("There is no previous history.");
return _pastHistory.Pop();
}
ปัญหาของฉันคือฉันต้องการทดสอบหน่วยว่า Remove จะส่งคืนออบเจ็กต์ที่เพิ่มล่าสุด
AddObjectToHistory
RemoveObjectToHistory
-> ส่งคืนสิ่งที่ใส่ไว้ผ่านทางAddObjectToHistory
อย่างไรก็ตาม ถ้าฉันต้องเรียก Add ก่อนไม่ใช่ Unit Test ใช่ไหม แต่วิธีเดียวที่ฉันสามารถทำได้ในวิธีทดสอบหน่วยที่แท้จริงคือการส่งผ่านวัตถุ Stack ในตัวสร้างหรือจำลอง IsAnyHistory
...แต่การเยาะเย้ย SUT ของฉันก็แปลกเช่นกัน ดังนั้น คำถามของฉันคือ จากมุมมองที่ดันทุรัง นี่เป็นการทดสอบหน่วยหรือไม่ ถ้าไม่ ฉันจะทำความสะอาดได้อย่างไร...การฉีดคอนสตรัคเตอร์เป็นวิธีเดียวของฉันเหรอ? มันดูเหมือนเป็นการยืดเวลาที่ต้องผ่านวัตถุธรรมดา ๆ ใช่ไหม? เป็นไปได้ไหมที่จะผลักแม้แต่วัตถุธรรมดา ๆ นี้ออกไปเพื่อฉีด?
IsAnyHistory
จะโยนInvalidOperationException
คุณควรตรวจสอบCount
แทนที่จะใช้Peek
- person Mike Zboray   schedule 24.06.2013