2010-06-17 84 views
7

看起来格外严格,但规则任何公开可用的应该测试应该测试auto-implemented properties单元测试自动执行的属性是否有价值

Customer类

public class Customer 
{ 
    public string EmailAddr { get; set; } 
} 

通过

[TestClass] 
public class CustomerTests : TestClassBase 
{ 
    [TestMethod] 
    public void CanSetCustomerEmailAddress() 
    { 
     //Arrange 
     Customer customer = new Customer(); 

     //Act 
     customer.EmailAddr = "[email protected]"; 

     //Assert 
     Assert.AreEqual("[email protected]", customer.EmailAddr); 
    } 
} 

回答

7

如果从自动实现的属性切换到完全不同的东西,会发生什么?该测试似乎只是多余的,因为你知道实现 - 在编写测试时你不应该考虑这一点。

当然,这取决于你实际上很快改变实施的可能性。

+4

但是,如果发生这种情况,你可以通过先写测试来做到这一点吗?那么它会被测试。至少如果你做TDD,这将是它的工作方式。我们都知道人们并不总是先写测试。 – ckramer 2010-06-17 21:16:36

+1

+1为回归方面。这是今天的汽车财产,但明天它可能需要修改以支持新的类功能等。 – 2010-06-18 02:40:29

1

这取决于你要测试的是一个API符合预期的属性集的测试,或者如果你表现出,你只是测试访问和设置属性。

在你给的例子中,我会说不。

更新

符合预期API;如果您间接访问属性,请在反射/动态环境中说,并且您使用属性和方法访问调用来验证未知的API是否符合预期的API。

+0

您可以详细说明“测试API是否符合预期属性集合”的意思吗? – ahsteele 2010-06-17 21:12:22

10

我通常认为任何不执行动作的代码都不值得测试。这通常意味着我不测试属性(自动实现或不),因为它们只是设置或返回一个值。

如果属性的getter或setter执行某种“工作”,比如可能根据某些其他字段/属性/任何其他状态返回两个(或更多)值中的一个,则这会改变。

如果你还没有看到它,我强烈推荐Roy Osherove'sbook on Unit Testing。它涉及各种“什么时候测试什么时候”类型的问题,包括这个问题。

+1

测试自动属性测试框架,而不是您的代码:没有代码逻辑来验证。如果你最终在属性后面添加代码,你应该看到测试覆盖率下降,这将表明现在是测试该属性的时候了。 – Mathias 2010-06-18 22:38:02

+0

它比看到测试覆盖率下降更简单...正如我在其他响应中评论的那样,如果您更改代码以使其不是自动属性,那么该更改应该由测试驱动,因此您将在那个时候测试功能的变化。 – ckramer 2010-06-18 22:51:19

0

单元测试应该仅限于您在应用程序中实现的测试功能。

您不应该测试应用程序依赖的API/SDK。部分原因是浪费时间(贵公司是否想支付测试X-Third-Party的SDK/API的费用),部分原因是它将“噪声”引入到单元测试套件中。单元测试库的上下文应该只是测试应用程序中的代码。

+0

'客户'是我们拥有的一类。 – ahsteele 2010-06-17 21:16:47

+0

@ahsteele,true,但是您的测试可以说只是测试C#编译器的行为。 – Yishai 2010-06-17 21:25:31

+0

@易海同意了,在重读这个答案时,我看到了战士们在驾驶什么。 – ahsteele 2010-06-17 21:33:52

1

测试设置和获取属性应该在测试对象的业务功能的上下文中发生。如果没有业务功能测试该属性,那么您不需要该属性或者需要更多测试。我建议你在添加需要它们的测试时添加属性,而不是在编写任何测试之前添加它们。

通过测试业务功能,您将从单元测试的角度看待更多的黑匣子。这使您可以在下面切换实施细节,对测试影响更小。由于重构是TDD循环中一个重要的(并且经常被忽略的)阶段,这意味着很少的代码编辑。你也许会意识到(例如)该属性不应该有公共setter,应该由执行验证和其他业务逻辑的方法来分配。

相关问题