似乎是一个受欢迎的问题,但我还没有找到答案,所以
简而言之,我有一个通用功能,我需要在其上执行unit test
,比如说
public void T[] DoSomething<T>(T input1, T input2)
现在我需要测试这个函数是否对int,ArrayList正常工作,如何在这种情况下编写单元测试,列出T的所有情况都不是一个选项,我想的只是测试int和一些类实例?
我也尝试使用VS2012的自动生成单元测试,看起来像:
public void DoSomethingHelper<T>() {
T item1 = default(T);; // TODO: Initialize to an appropriate value
T item2 = default(T); // TODO: Initialize to an appropriate value
T[] expected = null; // TODO: Initialize to an appropriate value
T[] actual = SomeClass.DoSomething<T>(item1, item2);
Assert.AreEqual(expected, actual);
Assert.Inconclusive("Verify the correctness of this test method.");
}
[TestMethod()]
public void AddTest() {
AddTestHelper<GenericParameterHelper>();
}
这对我来说更加困惑,我应该在DoSomethingHelper中初始化变量?一个int,一个字符串或什么?
有人可以帮忙吗?我听说过Pex和其他人,但仍然没有人为我提供这个简单功能的样本单元测试代码。
答案 0 :(得分:4)
您可能需要检查NUnit’s Generic Test Fixtures,以便对T
的多个实施进行测试
首先,请考虑以下事项:为什么要创建该功能通用?
如果您正在编写通用函数/方法,不应该关心它正在使用的类型的实现。我的意思是,只不过你在泛型类中指定的内容(例如。where T : IComparable<T>, new()
等)
所以,我的建议是你创建一个符合泛型类型要求的虚拟类,并用它进行测试。使用NUnit
的示例:
class Sample {
//code here that will meet the requirements of T
//(eg. implement IComparable<T>, etc.)
}
[TestFixture]
class Tests {
[Test]
public void DoSomething() {
var sample1 = new Sample();
var sample2 = new Sample();
Sample[] result = DoSomething<Sample>(sample1, sample2);
Assert.AreEqual(2, result.Length);
Assert.AreEqual(result[0], sample1);
Assert.AreEqual(result[1], sample2);
}
}
修改强>
想一想,你会发现它有效。你可能会想:“嗯,但如果DoSomething
的主体有类似...... ”的话会怎么样:
if (item1 is int) {
//do something silly here...
}
当使用int
进行测试时,它当然会失败,因为你正在测试Sample
类,所以你不会注意到它,但是把它想象成你正在测试一个函数总结两个数字,你有类似的东西:
if (x == 18374) {
//do something silly here...
}
你也不会识别它。