nUnit has a great feature of running multiple similar test cases via data-driven approach:
[TestCase("", "")]
[TestCase("q", "q")]
[TestCase("xyz", "zyx")]
public void TestStringReverse(string s, string expectedResult)
{
var result = Reverse(s);
Assert.AreEqual(expectedResult, result);
}
However, that does not work with dates, since DateTime is not a primitive type and cannot be used in an attribute.
[TestCase(new DateTime(...), new DateTime(...), false)] // Does not work
public void TestIntervalIsGood(DateTime from, DateTime to, bool isGood)
{
...
}
The solution is to supply test data in runtime, using [ValueSource] attribute. This is more code, but it works.
// warning: not tested
public class Interval
{
public DateTime From;
public DateTime To;
}
public class TestCase
{
public int Id;
public DateTime From;
public DateTime To;
public bool IsGood;
// We need this override, so test cases are shown well in nUnit. Otherwise they all look like MyTestClass+TestCase
// We could show actual dates, but it is kind of long, so I opted for a numeric ID
public override string ToString()
{
return "TestCase " + Id;
}
}
private static TestCase T(int id, DateTime from, DateTime to, bool isGood)
{
return new TestCase { Id = id, From = from, To = to, IsGood = isGood };
}
private static readonly DateTime Before = ...;
private static readonly DateTime Inside = ...;
private static readonly DateTime After = ...;
private static readonly TestCase[] TestCases =
{
T(1, Before, Before, false),
T(2, Before, Inside, true),
T(3, Before, After, true)
};
public void TestIntervalIsGood([ValueSource(nameof(TestCases))] TestCase testCase)
{
bool isGood = IsIntervalGood(testCase.From, testCase.To);
Assert.AreEqual(testCase.IsGood, isGood);
}
