0

似乎是一个热门问题,但我还没有找到答案,所以

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

4

1 回答 1

4

您可能需要检查NUnit 的 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...
}

你也认不出来。

于 2013-03-02T04:24:34.180 回答