C# 新增的功能打破了我的测试——逻辑也非常简单
我有类似的代码:C# 新增的功能打破了我的测试——逻辑也非常简单,c#,.net,unit-testing,tdd,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 d
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);
}
public List Expected=new List();
公共int-DID;
公共数据输入(int-ID,字符串值)
{
预期。增加(价值);
//if(ID==SpecifiedID)
//Expected.Clear();
//需要添加这个,但是我的测试
//AreEqual集合资产(新的[]{“2”、“4”、“6”、“8”},logic.Expected);
//所有预期的失败都为空。
}
//示例测试
[测试]
公共测试函数()
{
MyClass逻辑=新的MyClass();
logic.SpecifiedID=4;
逻辑。数据输入(1,“2”);
逻辑。数据输入(2,“4”);
逻辑。数据输入(3,“6”);
逻辑。数据输入(4,“8”);
//如果需要,此操作将失败。在类中添加了Clear。
AreEqual集合资产(新的[]{“2”、“4”、“6”、“8”},logic.Expected);
}
这被简化了很多,但是当调用DataIn
时,我有一些测试来检查预期内容的有效性。然而,我现在意识到,在每次调用DataIn
后,我都必须清除预期的
。这显然破坏了我的测试,因为这里面没有什么可以反对的
关于如何保留验证内容并允许我清空集合的测试的任何建议?为什么不更改测试功能呢。创建一个新的测试功能:
[Test]
public void NewTestFunction()
{
Data("Bla");
//Test for something
Expected.Clear();
}
如果这不是您想要的,请澄清。为什么不更改测试功能。创建一个新的测试功能:
[Test]
public void NewTestFunction()
{
Data("Bla");
//Test for something
Expected.Clear();
}
如果这不是您要求的,请澄清。初始化到已知良好状态应该是测试/类设置方法的一部分。但是,从您的描述来看,您的测试之间可能存在过多耦合,或者您的测试一次测试过多。每个测试,在适当的设置下,应该是独立的,理想情况下能够并行运行。通常这意味着每一个都针对被测类的不同实例运行,并且您对全局数据没有依赖关系,或者至少这些依赖关系是只读的,因此您可以为所有测试设置一次。初始化到已知良好状态应该是测试/类设置方法的一部分。但是,从您的描述来看,您的测试之间可能存在过多耦合,或者您的测试一次测试过多。每个测试,在适当的设置下,应该是独立的,理想情况下能够并行运行。通常这意味着每个都针对被测类的不同实例运行,并且您对全局数据没有依赖关系,或者至少这些依赖关系是只读的,因此您可以为所有测试设置一次。答案很简单-您的代码没有通过测试。也就是说,它的行为不符合预期(您在测试中描述了预期的行为)。因此,代码应该更改-删除对Expected.Clear()的调用。或者考虑一下您对代码的期望
更新(针对预期变化的情况):
也考虑做行为测试而不是状态测试。通过向类提供mock,您可以检查它如何与它们交互。例如,检查传递给类依赖项的数据。
答案很简单-您的代码没有通过测试。也就是说,它的行为不符合预期(您在测试中描述了预期的行为)。因此,代码应该更改-删除对Expected.Clear()的调用。或者考虑一下您对代码的期望
更新(针对预期变化的情况):
也考虑做行为测试而不是状态测试。通过向类提供mock,您可以检查它如何与它们交互。例如,检查传递给类依赖项的数据
当SpecifiedID匹配时,必须清除所有内容
这是一个测试。实例化您的对象。给它指定一个X的specifiedd。使用Y作为第一个参数,然后使用X作为第一个参数对其调用DataIn()。断言期望值为空。简单
当进行下一次调用时,它会再次开始向其中添加数据,以备将来使用
验证
这是另一个测试。实例化您的对象。为它指定一个SpecifiedId为X。对其重复调用DataIn(),从不使用X作为ID。断言预期包含传递的值。简单
两个要求,两个测试。真的,我看不出有什么大不了的
当SpecifiedID匹配时,必须清除所有内容
这是一个测试。实例化您的对象。给它指定一个X的specifiedd。使用Y作为第一个参数,然后使用X作为第一个参数对其调用DataIn()。断言期望值为空。简单
当进行下一次调用时,它会再次开始向其中添加数据,以备将来使用
验证
这是另一个测试。实例化您的对象。为它指定一个SpecifiedId为X。对其重复调用DataIn(),从不使用X作为ID。断言预期包含传递的值。简单
两个要求,两个测试。真的,我看不出有什么大不了的。哪些测试?这是不可回答的。我有一些做断言的测试,比如CollectionAssert.AreEqual(新[]{“2”、“4”、“6”、“8”},logic.ExpectedValues);如果我在我的方法中添加Expected.Clear,这些类型的测试将失败。大多数单元测试框架都有一个在所有单元测试之间运行的设置/拆卸机制。这会破坏您的测试,因为方法逻辑不再相同。重写您的测试以匹配该方法的实际功能。@ken2k我想这样做,但我不知道如何才能这样做,因此问题是:哪些测试?这是不可回答的。我有一些做断言的测试,比如CollectionAssert.AreEqual(新[]{“2”、“4”、“6”、“8”},logic.ExpectedValues);如果我在我的方法中添加Expected.Clear,这些类型的测试将失败。大多数单元测试框架都有一个在所有单元测试之间运行的设置/拆卸机制。这会破坏您的测试,因为方法逻辑不再相同。重写您的测试以匹配该方法的实际功能。@ken2k我想这样做,但我不知道怎么做,因此