增加的功能打破了我的测试 - 非常简单的逻辑

时间:2012-03-21 12:39:03

标签: c# .net unit-testing tdd

我的代码类似于:

public List<string> Expected = new List<string>();
public int SpecifiedID;

public DataIn(int ID, string Value)
{
  Expected.Add(Value);
  //if (ID == SpecifiedID)
  //Expected.Clear();  

  //Need to add this but my tests that do something like      
  //CollectionAssert.AreEqual(new[] { "2", "4", "6", "8" }, logic.Expected);
  //all fail as Expected is empty.
}

//Example Test
[Test]
public void NewTestFunction()
{
   MyClass logic = new MyClass();   
   logic.SpecifiedID = 4;

   logic.DataIn(1,"2"); 
   logic.DataIn(2,"4"); 
   logic.DataIn(3,"6"); 
   logic.DataIn(4,"8"); 

   //This will FAIL if Expected.Clear is added in the class.
   CollectionAssert.AreEqual(new[] { "2", "4", "6", "8" }, logic.Expected);
}

这已经简化了很多,但我有一些测试可以在调用Expected时检查DataIn内容的有效性。但是我现在已经意识到每次Expected通话后我都必须清除DataIn。这显然打破了我的测试,因为它没有任何内容可以断言。

有关如何保留验证内容的测试以及允许我清空集合的任何建议吗?

4 个答案:

答案 0 :(得分:2)

答案很简单 - 您的代码未通过测试。即它的行为不符合预期(您在测试中描述了预期的行为)。因此,代码应该更改 - 删除对Expected.Clear()的调用。或者考虑一下您对代码的期望。

更新(对于预期变更的情况):

public void ShoulHaveAllDataInWhenIdIsNotSpecifiedID()
{
   MyClass logic = new MyClass();   
   logic.SpecifiedID = 3;

   logic.DataIn(1,"2"); 
   logic.DataIn(2,"4");     

   CollectionAssert.AreEqual(new[] { "2", "4" }, logic.Expected);
}

[Test]
public void ShoulClearAllDataWhenSpecifiedIDPassed()
{
   MyClass logic = new MyClass();   
   logic.SpecifiedID = 3;

   logic.DataIn(1,"2"); 
   logic.DataIn(2,"4"); 
   logic.DataIn(3,"6");     

   CollectionAssert.AreEqual(new[] { }, logic.Expected);
}

还要考虑进行行为测试而不是状态测试。通过为您的班级提供模拟,您可以检查它与它们的交互方式。即检查传递给类依赖项的数据。

答案 1 :(得分:1)

初始化为已知良好状态应该是您的测试/类设置方法的一部分。但是,从您的描述来看,您的测试之间可能存在过多的耦合,或者您的测试一次测试过多。通过适当的设置,每个测试应该是独立的,并且理想情况下能够并行运行。通常这意味着每个都针对被测试类的不同实例运行,并且您没有依赖于全局数据,或者至少这些依赖项是只读的,因此您可以为所有测试设置一次。

答案 2 :(得分:1)

  

当SpecifiedID匹配时,必须清除所有内容

这是一个测试。实例化您的对象。给它一个X的SpecifiedId。用Y作为第一个参数调用DataIn(),然后用X作为第一个参数。断言预期是空的。简单。

  

当下一次调用时,它开始再次向其添加数据   验证

这是另一项测试。实例化您的对象。给它一个X的SpecifiedId。在它上面反复调用DataIn(),从不使用X作为ID。断言Expected包含传递的值。简单。

两个要求,两个测试。真的,我不明白这里有什么大不了的。

答案 3 :(得分:0)

为什么不改变测试功能。创建测试功能:

[Test]
public void NewTestFunction()
{
    Data("Bla"); 

    //Test for something


    Expected.Clear();
}

如果这不是您所要求的,请澄清。