Moo*_*ice 4 c# generics unit-testing
我正在针对我们的核心框架编写单元测试,并且遇到了这个问题.
我们有一个扩展方法,如下所示:
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>
Run Code Online (Sandbox Code Playgroud)
(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;
}
}
Run Code Online (Sandbox Code Playgroud)
然后是以下内容:
[TestMethod()]
public void ThrowIfDefaultTest()
{
ThrowIfDefaultTestHelper<int>(10);
ThrowIfDefaultTestHelper<Guid>(Guid.NewGuid());
ThrowIfDefaultTestHelper<DateTime>(DateTime.Now);
ThrowIfDefaultTestHelper<object>(new { Name = "Test" }); // anonymous object
}
Run Code Online (Sandbox Code Playgroud)
单元测试在最后一个测试失败时NullReferenceException抛出,因为我猜测object没有default(T)(或者是吗?).我不能用这种方式测试匿名对象吗?
das*_*ght 11
object它确实有default(T),它恰好是null.这与使用非可空值类型的其他测试用例不同.这就是为什么你得到一个NullReferenceException而不是你期望的那个.
如果你更换
self.Equals(default(T))
Run Code Online (Sandbox Code Playgroud)
同
EqualityComparer<T>.Default.Equals(obj, default(T))
Run Code Online (Sandbox Code Playgroud)
你应该开始得到预期的ArgumentException.