Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.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#_Unit Testing_Testing - Fatal编程技术网

C# 如果一个方法将其大部分行为委托给同一类中的另一个方法而不重复测试,我应该如何测试该方法?

C# 如果一个方法将其大部分行为委托给同一类中的另一个方法而不重复测试,我应该如何测试该方法?,c#,unit-testing,testing,C#,Unit Testing,Testing,我在VS2013中使用C#和内置测试工具 例如,我有一个Order对象,它有一个Customer对象列表。我有两种方法可以从订单中删除客户。一个采用Customer对象作为参数,另一个采用Customer的Id。第一种方法进行实际删除。第二种方法使用Id查找订单中的Customer实例,然后将该实例传递给第一种方法 第一种方法具有完全的测试覆盖率。在测试第二个方法时,我只需要验证它是否找到了客户,然后调用第一个方法。我不需要验证客户是否真的被删除了,因为第一个方法的测试会解决这个问题 我不需要验

我在VS2013中使用C#和内置测试工具

例如,我有一个
Order
对象,它有一个
Customer
对象列表。我有两种方法可以从
订单中删除客户
。一个采用
Customer
对象作为参数,另一个采用
Customer
Id
。第一种方法进行实际删除。第二种方法使用
Id
查找订单中的
Customer
实例,然后将该实例传递给第一种方法

第一种方法具有完全的测试覆盖率。在测试第二个方法时,我只需要验证它是否找到了客户,然后调用第一个方法。我不需要验证
客户
是否真的被删除了,因为第一个方法的测试会解决这个问题

我不需要验证客户是否真的被删除了,因为第一种方法的测试会解决这个问题

如果这些方法在将来某个时候被改变了呢?现在,第二种方法没有使用第一种方法,并且被破坏了,但是您的测试仍然通过了吗

我仍然会测试这两种方法的预期结果。除了我不会在测试个别方法时考虑它;将其视为测试行为。如果您获得了有效的Id,则该客户将被删除。如果您获得了有效的
客户
,则该客户将被删除。预期的行为不是通过方法内的id成功检索到客户。预期的行为是,当给定一个有效参数(无论是id还是customer对象)时,客户将被删除,因此请对此进行测试

我不知道您的全部要求,但我会编写如下测试:

  • GivenValidd_移除客户
  • 给予有效客户
  • GivenNullCustomer\u ThrowException
  • 给你一个例外
  • 我不需要验证客户是否真的被删除了,因为第一种方法的测试会解决这个问题

    如果这些方法在将来某个时候被改变了呢?现在,第二种方法没有使用第一种方法,并且被破坏了,但是您的测试仍然通过了吗

    我仍然会测试这两种方法的预期结果。除了我不会在测试个别方法时考虑它;将其视为测试行为。如果您获得了有效的Id,则该客户将被删除。如果您获得了有效的
    客户
    ,则该客户将被删除。预期的行为不是通过方法内的id成功检索到客户。预期的行为是,当给定一个有效参数(无论是id还是customer对象)时,客户将被删除,因此请对此进行测试

    我不知道您的全部要求,但我会编写如下测试:

  • GivenValidd_移除客户
  • 给予有效客户
  • GivenNullCustomer\u ThrowException
  • 给你一个例外
  • 第一种方法具有完全的测试覆盖率。在测试第二个方法时,我只需要验证它是否找到了客户,然后调用第一个方法我不需要验证客户是否真的被删除了,因为第一种方法的测试会解决这个问题。

    我不同意。这正是您需要测试的,因为这是您正在测试的方法的目的。如何实现这一目标是一个实现细节

    该方法有一个目标:从订单中删除客户。您的单元测试必须确保将客户从订单中删除。然后必须排列数据,然后调用方法,最后验证结果。该方法现在可能会在同一个类中吞食另一个方法,但这并不意味着以后不能更改实现。但是,如果您确实更改了实现,那么您已经进行了测试,以验证您在执行此操作时没有中断功能

    另一种看待它的方式,这就是我在编写测试时试图做的,就是将被测试的系统视为一个黑匣子。你不知道它是如何工作的,你也不在乎。您只知道它有一项工作要做,您正在编写测试来验证它是否完成了任务。有一些部分向您公开(依赖项、参数、结果),但是在编写测试时,实现本身并不是您所关心的。因此,它重用已经测试过的功能这一事实也不是您所关心的

    尽管如此,如果您觉得自己在测试中重复太多,那么这是一个机会,可以看看您的系统是否可以重新设计(例如,实际上可能存在另一个可以提取的类或依赖项),但实际上您的系统可能已经够简单了,您的测试虽然看起来是重复的,确保无论您选择哪条道路,设计都能正确履行其职责

    第一种方法具有完全的测试覆盖率。在测试第二个方法时,我只需要验证它是否找到了客户,然后调用第一个方法我不需要验证客户是否真的被删除了,因为第一种方法的测试会解决这个问题。

    我不同意。这正是您需要测试的,因为这是您正在测试的方法的目的。如何实现这一目标是一个实现细节

    该方法有一个目标:从订单中删除客户。您的单元测试必须确保将客户从订单中删除。然后必须排列数据,然后调用方法,最后验证结果。该方法现在可能会在同一个类中吞食另一个方法,但这并不意味着以后不能更改实现。但是,如果您确实更改了实现,那么您已经有测试来验证您没有破坏fu