我刚刚阅读了这个post,并且在开始使用测试驱动的开发/设计时使用了隐式类型。
他的帖子说,当单元测试一个方法时,在为返回类型使用隐式类型时,TDD可以“减速”。此外,他似乎想要测试指定的返回类型以推动开发(这对我来说很有意义)。
使用隐式类型的给定单元测试可能如下所示:
public void Test_SomeMethod()
{
MyClass myClass = new MyClass();
var result = myClass.MethodUnderTest();
Assert.AreEqual(someCondition, result);
}
所以我的问题是:
使用隐式类型是否有助于或阻碍TDD的单元测试?在编写单元测试时,有没有人可以分享他们使用这种技术的经验?
我问这个是因为很快我还没有完成TDD并且想知道是否有办法编写泛型或半泛型单元测试,这些单元测试可能会改变返回类型。
答案 0 :(得分:3)
我明白了他的观点但我并不认为这是不在var
使用的正确理由。请记住,TDD大致按照以下方式工作:
我们是否使用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提供的信息越多,我必须做的输入就越少。