【发布时间】:2013-04-24 03:16:14
【问题描述】:
我正在针对我们的核心框架编写单元测试,并且遇到了这个问题。
我们有一个如下所示的扩展方法:
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>
(我在 Stack Overflow 上看到的 ThrowIfNull<> 扩展方法的变体。
在为此写一个测试用例的时候,我先写了一个helper:
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
}
单元测试在最后一个失败,因为NullReferenceException 被抛出,因为我猜object 没有default(T)(或者是吗?)。我不能用这种方式测试匿名对象吗?
【问题讨论】:
-
在一个唯一目的是检查
null的方法中使用实例方法(Equals)有点奇怪... -
@DanielHilgarth,绝对!当别人看到时,人们会错过的小东西是非常明显的。因此,使用单元测试是个好主意……我们都是人类 :)
标签: c# unit-testing generics