Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 新增的功能打破了我的测试——逻辑也非常简单_C#_.net_Unit Testing_Tdd - Fatal编程技术网

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我想这样做,但我不知道怎么做,因此