ฉันรู้ว่านี่เป็นอีกหนึ่งคำตอบที่ล่าช้า แต่ในทีมของฉันที่ถูกล็อกไว้ในการใช้กรอบการทดสอบ MS เราได้พัฒนาเทคนิคที่อาศัยเฉพาะ Anonymous types เพื่อเก็บข้อมูลการทดสอบอาร์เรย์และ LINQ เพื่อวนซ้ำและทดสอบแต่ละแถว ไม่จำเป็นต้องมีคลาสหรือเฟรมเวิร์กเพิ่มเติมและมีแนวโน้มที่จะอ่านและเข้าใจได้ค่อนข้างง่าย นอกจากนี้ยังใช้งานได้ง่ายกว่าการทดสอบที่ขับเคลื่อนด้วยข้อมูลโดยใช้ไฟล์ภายนอกหรือฐานข้อมูลที่เชื่อมต่อ
ตัวอย่างเช่นสมมติว่าคุณมีวิธีการขยายดังนี้:
public static class Extensions
{
/// <summary>
/// Get the Qtr with optional offset to add or subtract quarters
/// </summary>
public static int GetQuarterNumber(this DateTime parmDate, int offset = 0)
{
return (int)Math.Ceiling(parmDate.AddMonths(offset * 3).Month / 3m);
}
}
คุณสามารถใช้และอาร์เรย์ของ Anonymous types รวมกับ LINQ เพื่อเขียนแบบทดสอบดังนี้:
[TestMethod]
public void MonthReturnsProperQuarterWithOffset()
{
// Arrange
var values = new[] {
new { inputDate = new DateTime(2013, 1, 1), offset = 1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 1, 1), offset = -1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 4, 1), offset = 1, expectedQuarter = 3},
new { inputDate = new DateTime(2013, 4, 1), offset = -1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 7, 1), offset = 1, expectedQuarter = 4},
new { inputDate = new DateTime(2013, 7, 1), offset = -1, expectedQuarter = 2},
new { inputDate = new DateTime(2013, 10, 1), offset = 1, expectedQuarter = 1},
new { inputDate = new DateTime(2013, 10, 1), offset = -1, expectedQuarter = 3}
// Could add as many rows as you want, or extract to a private method that
// builds the array of data
};
values.ToList().ForEach(val =>
{
// Act
int actualQuarter = val.inputDate.GetQuarterNumber(val.offset);
// Assert
Assert.AreEqual(val.expectedQuarter, actualQuarter,
"Failed for inputDate={0}, offset={1} and expectedQuarter={2}.", val.inputDate, val.offset, val.expectedQuarter);
});
}
}
เมื่อใช้เทคนิคนี้คุณควรใช้ข้อความที่จัดรูปแบบซึ่งมีข้อมูลอินพุตใน Assert เพื่อช่วยคุณระบุว่าแถวใดที่ทำให้การทดสอบล้มเหลว
ฉันได้ blogged เกี่ยวกับการแก้ปัญหานี้ที่มีพื้นหลังมากขึ้นและรายละเอียดที่AgileCoder.net