2012-09-15 74 views
3

这是一个非常基本的问题,但我仍然无法找到合适的答案。在我的测试中,可能有空值,因为最后一个阶段(Act)开始看起来有点奇怪(它不再只是行为)。我的意思是这样的:单元测试检查为空

Assert.IsNotNull(variable); 

var newVariable = variable.Property; 
Assert.IsNotNull(newVariable); 

var finalVariable = newVariable.AnotherProperty; 
Assert.AreEqual(3, finalVariable.Count); 

现在,他们有明显的关系,我必须确保该值不为空,但也有三个主张在一个测试和行为的部分开始看不正确。

那么这种情况下的一般解决方案是什么?有没有什么比3个测试更聪明,每个测试都有一个断言,并在最后2个断言之前检查为空?

回答

1

基本上有处理你的问题的方法有两种:

  1. Guard assertions:额外的断言确保数据在已知状态适当的测试发生之前(也就是你在做什么现在)。
  2. 移动后卫断言自己测试。

选择哪个选项在很大程度上取决于测试中的代码。如果前提条件在其他测试中会被重复,则这是暗示单独的测试方法。如果先决条件在生产代码中有所反映,则再次提示单独的测试方法。另一方面,如果它只是提高信心的一种方式,也许单独的测试过多(但在其他答案中已经提到过,这可能表示您未完全控制测试或者你一次测试太多东西)。

0

我认为你应该把这个测试分成三个测试,并根据发生的情况命名。即使您在这些测试中的行为相同,您也可以通过检查方法的返回值来测试不同的场景。

0

空是皇室的痛苦。问题是,他们能合理地存在吗?

让我们将讨论分解为代码和测试。

如果null不应该存在,那么代码本身而不是测试应检查并验证它们不为空。出于这个原因,我的代码每一个方法是使用检查参数的片断建:

public VideoPosition(FrameRate theFrameRate, TimeSpan theAirTime) 
    { 

     Logger.LogMethod("theVideoMovie", theFrameRate, "theAirTime", theAirTime); 
     try 
     { 
      #region VerifyInputs 

      Validator.Verify(theFrameRate); 
      Validator.Verify(theAirTime); 
      Validator.VerifyTrue(theAirTime.Ticks >= 0, "theAirTime.Ticks >= 0"); 

如果空在代码中合法的,但你正在测试一种情况,返回的值不能为空,那么当然你必须在你的测试代码中验证这一点。

0

在你的单元测试中,你应该能够控制你的课堂上的每一个输入。这意味着你可以控制变量是否有值。

所以,你将有一个单元测试,强制你的变量为空,然后断言这一点。

然后,您将进行另一个测试,您可以确定您的变量有一个值,并且您不需要其他断言。

我前一段时间写了一篇关于这个的博客。也许它可以帮助:Unit Testing, hell or heaven?