私は、コア フレームワークに対して単体テストを作成している最中で、これに遭遇しました。
次のような拡張メソッドがあります。
public static T ThrowIfDefault<T>(this T self, string variableName)
{
if (self.Equals(default(T)))
throw new ArgumentException(string.Format("'{0}' cannot be default(T)", variableName));
return self;
} // eo ThrowIfDefault<T>
ThrowIfNull<>
( Stack Overflow で見た拡張メソッドのバリエーション。
このためのテスト ケースを作成するにあたり、最初にヘルパーを作成しました。
public void ThrowIfDefaultTestHelper<T>(T value)
{
// unit test *itself* requires that a value be specified!!
Assert.AreNotEqual(default(T), value);
// Good test
GenericExtensionMethods.ThrowIfDefault(value, "value");
// Bad test
try
{
GenericExtensionMethods.ThrowIfDefault(default(T), "value");
}
catch (ArgumentException)
{
// Expected result
}
catch (Exception)
{
throw;
}
}
そして、次のとおりです。
[TestMethod()]
public void ThrowIfDefaultTest()
{
ThrowIfDefaultTestHelper<int>(10);
ThrowIfDefaultTestHelper<Guid>(Guid.NewGuid());
ThrowIfDefaultTestHelper<DateTime>(DateTime.Now);
ThrowIfDefaultTestHelper<object>(new { Name = "Test" }); // anonymous object
}
ユニットテストは、 aNullReferenceException
がスローされたときに最後のテストで失敗します。この方法で匿名オブジェクトをテストすることはできませんか?object
default(T)