我的代码类似于:
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
。这显然打破了我的测试,因为它没有任何内容可以断言。
有关如何保留验证内容的测试以及允许我清空集合的任何建议吗?
答案 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();
}
如果这不是您所要求的,请澄清。