2010-05-16 131 views
6

我正在使用Visual Studio进行测试驱动开发的第一步。我有一些关于如何使用VS 2010实现泛型类的问题。Visual Studio 2010和测试驱动开发

首先,让我们说我想实现我自己的ArrayList版本。

[TestMethod] 
public void Add_10_Items_Remove_10_Items_Check_Size_Is_Zero() { 
    var myArrayList = new MyArrayList<int>(); 

    for (int i = 0; i < 10; ++i) { 
     myArrayList.Add(i); 
    } 

    for (int i = 0; i < 10; ++i) { 
     myArrayList.RemoveAt(0); //should this mean RemoveAt(int) or RemoveAt(T)? 
           //VS doesn't know. Any work arounds? 
    } 

    int expected = 0; 
    int actual = myArrayList.Size; 
    Assert.AreEqual(expected, actual); 
} 

我使用VS 2010的能力打

CTRL +: 我创建了下面的测试(我使用的是在这种情况下MSTest的)开始。

并让它在旅途中实现类/方法。

  1. 我在实现泛型类时遇到了一些麻烦。例如,当我定义一个.Add(10)方法时,VS不知道我是否打算使用泛型方法(因为该类是通用的)或方法Add(int number)。有什么办法可以区分这一点吗?
  2. 返回类型也会发生同样的情况。假设我正在实现一个MyStack堆栈,并且我想测试在我推入元素并弹出它之后,堆栈仍然是空的。我们都知道流行应该返回一些东西,但通常这个测试的代码不应该关心它。然后Visual Studio会认为pop是一个无效的方法,实际上并不是人们想要的。如何处理这个?对于每种方法,我是否应该先做出“非常具体”的测试,比如显而易见的方法应该返回一些东西,这样我就不会产生这种模糊性?即使不使用结果,我是否应该有类似int popValue = myStack.Pop()的东西?
  3. 我应该如何对泛型类进行测试?只用一种通用类型的测试?我一直在使用int,因为它们很容易使用,但我是否也应该使用不同类型的对象进行测试?你通常如何处理这个问题?
  4. 我看到有一个名为TestDriven for .NET的流行工具。随着VS 2010的发布,它仍然是有用的,或者它的许多功能现在成为VS 2010的一部分,渲染它有点没用?
  5. 每当我在我的测试代码中定义一个新属性,并要求VS为我生成该方法存根时,它会同时生成一个getter和一个setter。如果我有类似int val = MyClass.MyProperty的东西,我想了解(至少)我只想定义一个getter。

感谢

+0

对于#4,你的意思是从Visual Studio内部运行测试,还是一般运行测试? – R0MANARMY 2010-05-16 17:44:38

+0

在Visual Studio里面。 – 2010-05-16 17:45:50

+0

如果你有5个不连续的问题,难道它不会让每个人的生活更容易发布每个问题作为一个单独的问题吗? – 2010-06-09 18:26:49

回答

3

我看到有一个叫做测试驱动的.NET常用的工具。随着VS 2010的发布,它仍然是有用的,或者它的许多功能现在成为VS 2010的一部分,渲染它有点没用?

它仍然在有效的情况下使用许多不同的单元测试框架(nunitmbunitxunitcsunit等)中的一种。

还有其他工具(如Visual Nunit),提供运行单元测试的visual studio集成。

+0

从我在Channel9上看到的,你也可以在VS 2010中使用几个框架。但是我没有试过去测试它。 – 2010-05-16 17:56:43

+0

@devoured elysium:我已经获得了Visual Studio测试运行器来运行NUnit测试。如果你想连续集成服务器(比如TeamCity或者CruiseControl.NET),你可能(或者可能不会)遇到MSTest的问题,如果不在服务器上安装Visual Studio,你将无法运行MSTest单元测试是一种烦人的要求)。 – R0MANARMY 2010-05-16 18:06:12

+0

你有没有关于如何使用Visual NUnit在VS2010内部运行NUnit测试的博客文章? :)我遇到了一些问题,所以想调查其他选项。 – Dave 2010-12-13 23:58:51

3

对于你的代码示例,为什么你会有一个方法RemoveAt(T obj)

您可以改为使用RemoveAt(int index)Remove(T obj)。看看微软的API(例如,for List<T>),看看他们如何为泛型集合设置Remove方法。

为使你们几点:

1:你会Add(int number)办?如果我正确理解你的意图,Add(10)只能被解释为“在我的收藏结束时添加值10”。如果您想在特定索引处添加值,则可以(也可能应该)为该方法命名插入:Insert(int index, T value)

2:肯定的是,Visual Studio将解释方法为void在第一,但你可以编辑它是像

public class MyStack<T> 
{ 
    public T Pop() 
    { 
    } 
} 

Ctrl+.内置存根是为了方便,而不是福音。您不必总是将返回值分配给变量。如果你在测试中不需要它,不要这样做。如果你希望VS使用void以外的返回类型,你可以写一个不同的单元测试(例如,Pop()返回最后一次推送的值)。 3:我会用我在代码中看到的最常用的类型进行测试。如果您正在编写公共API,请尽可能多地测试。如果您使用的是NUnit,请使用[TestCase]属性来帮助您避免编写一些重复的代码。

4:我仍然使用TestDriven,但我没有尝试过,没有它,所以我不能真正做出有用的比较。 5:如果你不需要它,只需删除setter即可。一些插件框架如ReSharper支持更高级的代码生成,包括只读属性。

+0

重读这些问题。你想完成关闭的点。我想要一个RemoveAt(int),但是因为我使用的是MyArrayList (),Visual Studio不知道我想实现哪种方法。 – 2010-05-16 18:04:51

+0

@devoured elysium:你的MyArrayList 类定义?因为只有一个RemoveAt()并且它接受到数组中的索引,所以在这种情况下实现哪种方法应该永远不会有任何混淆。如果你想从你的列表中删除一个整数值,你可以使用Remove()来代替。 – 2010-05-16 18:13:28

+0

我在这里的问题主要关注VS 2010存根代的功能,而不是如何开发类。无论如何,我想要一个Add(T元素)和RemoveAt(int索引)。 – 2010-05-16 18:15:49