隐式打字和TDD

时间:2010-01-26 16:10:16

标签: c# unit-testing tdd implicit-typing

我刚刚阅读了这个post,并且在开始使用测试驱动的开发/设计时使用了隐式类型。

他的帖子说,当单元测试一个方法时,在为返回类型使用隐式类型时,TDD可以“减速”。此外,他似乎想要测试指定的返回类型以推动开发(这对我来说很有意义)。

使用隐式类型的给定单元测试可能如下所示:

public void Test_SomeMethod()
{
    MyClass myClass = new MyClass();

    var result = myClass.MethodUnderTest();
    Assert.AreEqual(someCondition, result);
}

所以我的问题是:

使用隐式类型是否有助于或阻碍TDD的单元测试?在编写单元测试时,有没有人可以分享他们使用这种技术的经验?

我问这个是因为很快我还没有完成TDD并且想知道是否有办法编写泛型或半泛型单元测试,这些单元测试可能会改变返回类型。

3 个答案:

答案 0 :(得分:3)

我明白了他的观点但我并不认为这是不在var使用的正确理由。请记住,TDD大致按照以下方式工作:

  1. 写一个新的测试。
  2. 如果测试编译失败(并且它应该失败!),请编写足够的代码,直到测试编译完毕。
  3. 运行所有测试。
  4. 如果测试失败,请编写足够的代码,直到所有测试通过。
  5. 重构。
  6. 我们是否使用var测试将无法以任何方式进行编译,因为测试中的方法尚不存在!一旦我们开始编码NewMethod,他的观点就没有实际意义了。

    相反,这里不使用var的正确理由是因为代码没有说明result的类型是什么。这是一个意见问题,但var在这里没问题

    var dict = new Dictionary<Foo, List<Bar>>();
    

    和匿名类型但不在这里

    var m = M();
    

    因为如果没有M(或使用IntelliSense)声明M的返回类型是完全不清楚的。

答案 1 :(得分:1)

是和否

在Visual Studio中,TDD有点痛苦,特别是在使用隐式打字时。 var表示没有intellisense,然后当您输入可能不存在的类型的名称时,它倾向于使用与您键入的内容类似的内容自动完成,通常是测试夹具的名称。

Visual Studio 2010具有consume first mode,这使其成为测试驱动开发的理想选择。目前你会发现(在2008年及之前)你必须点击 escape 来隐藏智能感知。

至于var的使用,它纯粹是融合糖。在我看来,它使以下更好:

var type = new MyType();

清楚的是变量类型是MyType类型。 var非常适合仿制药,并遵循DRY的原则 - 不要重复自己

var type = MethodCall();

var result = ReturnResult();

另一方面,无论您是否遵循TDD,都会导致难以阅读的代码。良好的单元测试应该流动并且易于阅读。如果您不得不考虑,或将鼠标悬停在某个方法上以查看返回类型,则表示这是一个难以阅读且难以阅读的测试。

答案 2 :(得分:0)

从工具的角度来看,我认为避免变量更好。我使用Eclipse和Java,但我知道像CodeRush和Resharper这样的扩展提供了我在这里讨论的许多功能。在我的测试中,我调用了一个尚不存在的方法,我可以“快速修复”它以在所需的类中创建方法。自动创建的方法的返回类型取决于其上下文;如果我期待返回一个String,该方法的返回类型将是String。但是如果赋值是一个var(Java没有 - 但是如果它有),那么IDE就不会知道返回类型除var之外的任何东西(或者可能是Object)。

并非所有人都在TDD中以这种方式使用IDE,但我发现它非常有用。我可以在测试中为IDE提供的信息越多,我必须做的输入就越少。