C#中通用函数的单元测试

时间:2013-03-02 03:56:10

标签: c# unit-testing generics

似乎是一个受欢迎的问题,但我还没有找到答案,所以

简而言之,我有一个通用功能,我需要在其上执行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和其他人,但仍然没有人为我提供这个简单功能的样本单元测试代码。

1 个答案:

答案 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...
}

你也不会识别它。