나는 이것이 또 다른 늦은 대답이라는 것을 알고 있지만 MS Test 프레임 워크를 사용하는 데 갇혀있는 팀에서 테스트 데이터 배열을 보유하기 위해 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);
}
}
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의 입력 데이터를 포함하는 형식화 된 메시지를 사용하면 테스트가 실패하는 원인을 식별하는 데 도움이됩니다.
AgileCoder.net 에서이 솔루션에 대한 자세한 배경 정보와 세부 정보를 블로그에 올렸 습니다 .