2013-03-02 161 views
0

似乎是一个流行的问题,但我还没有找到答案,所以单元测试

短,我有一个通用的功能,我需要对它进行unit test,说

public void T[] DoSomething<T>(T input1, T input2)

现在我需要测试此功能工作正常的INT,ArrayList的,我怎么能写在这种情况下,单元测试,列出所有T的情况下,是不是一种选择,我我只想测试int和一些c拉斯实例?

我也尝试使用从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和其他人,但仍然没有人为我提供这个简单功能的示例单元测试代码。

+2

'DoSomething'应该做些什么?请使用一个有效的例子。如果你不知道该功能应该做什么,你将无法进行单元测试。 – 2013-03-02 04:09:49

+0

这是我的代码的简化版本,我认为它不会影响到那些函数的功能,我只需要一个有效的测试,以便它可以随我们输入的内容执行。无论如何,你可以认为这就像将这两个input1,input2返回到一个数组一样简单。 – thienhaflash 2013-03-02 04:15:59

+0

你说你的依赖是一个int,所以你需要设置项目1和项目2为int,并调用方法,并断言如果你得到它的权利。这件事情如此复杂? – zero7 2013-03-02 04:57:37

回答

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

你不会识别它的。

+0

我需要那个泛型函数来测试,当然如果我可以像所说的那样测试所有的情况,我不需要在这里提出一个问题。问题是如何测试一个通用函数,而不是什么是一种好的代码编写方式,以防止使用T或某些东西,如果我不把它放在哪里:这意味着我不希望它受到任何限制种类,项目可以是int,float,struct,枚举,类,对象,...全部。对不起,但这不是我预期的答案。 – thienhaflash 2013-03-02 06:13:34

+0

@thienhaflash我还是不理解你。试着更好地解释你自己。你需要理解的是,如果你正在编写一个**泛型**函数,那是因为你不关心它是什么类型,所以一些特定的类型不应该破坏函数。在你的例子中(一个在数组中添加两个参数的函数):一个'integer'如何使它失败,而'string'不能? – 2013-03-02 07:27:35

+0

你好,抱歉让你困惑。正如我在上面告诉的那样,功能里面的东西根本就不重要,所以我举了一个这样的例子。当然,我真的不在乎T是什么,但在这种情况下,我需要知道我需要实现的最小单元测试是什么,以确保它不会成为传递各种不同退化值/变量的问题类型,也许测试与空变量,一个int,一个字符串,一个类或任何东西,但这意味着很多。所以我想知道,人们如何测试函数以确保它永不中断(并且正确运行) – thienhaflash 2013-03-02 08:16:51