Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.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

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 - Fatal编程技术网

C# 单元测试什么都不返回,如何断言?

C# 单元测试什么都不返回,如何断言?,c#,unit-testing,C#,Unit Testing,您将如何断言这样的代码?这样做的最佳方法是什么 public void doSomething(int myProperty){ if (myProperty == 0) return; // If myProperty is not zero, do something in the method } 如果此代码不返回任何内容,其目的是什么?如果删除此行,会出现什么问题 如果您找到了这些问题的有价值的答案,您将找到测试代码的提示 如果没有找到答案,那么您可以安全地删除该行(因

您将如何断言这样的代码?这样做的最佳方法是什么

public void doSomething(int myProperty){
    if (myProperty == 0) return;
    // If myProperty is not zero, do something in the method
}

如果此代码不返回任何内容,其目的是什么?如果删除此行,会出现什么问题

如果您找到了这些问题的有价值的答案,您将找到测试代码的提示


如果没有找到答案,那么您可以安全地删除该行(因此没有要写入的测试)。

您可以断言,当
myProperty
为零时,
返回后发生的任何事情都不会发生

例如,如果方法是(伪代码!)

那么你的单元测试就可以了

  • Arrange
    myProperty
    设置为零,
    myOtherProperty
    设置为除
    2
  • 通过调用测试中的方法执行操作
  • 断言
    myOtherProperty
    仍设置为之前设置的值

    • 当我看到这一点时,我问的问题是:当myProperty不是零时会发生什么

      返回后是否有代码改变类级别/共享状态?您能否针对类级别/共享状态进行断言以验证行为


      当myProperty为零时,状态应该不受方法的影响

      您没有发布方法签名,因此我假设它的返回类型为void。在这种情况下,没有办法像您指出的那样测试它;但是,如果该方法与对象范围属性交互,则可以测试它们,以查看它们是否更改。

      无论您做什么,都需要针对可观察的影响进行测试。你的方法肯定是在做点什么

      使用基于状态的测试时
      ,您可以在执行该方法后检查或的状态,以查看该状态是否与您的体验相匹配


      如果这是不可能的,您将需要执行(又名基于交互的测试。这通常是通过模拟对象来完成的

      我认为Mark Seemann给了您完整的答案-这只是一个说明

      SomeVerifiableClass actor;
      
      public void doSomething(int myProperty){
          if (myProperty == 0) return;
      
          // If myProperty is not zero, do something in the method
          actor.doesSomething(myProperty);
      }
      
      然后,您可以选择模拟某个可验证类或使用真实类进行测试。如果您正确使用DI,那么模拟是一个更好的选择

      模拟:验证行为(伪代码):

      如果是真实对象,则验证状态:

        assert(isPrestine(actor));
      

      如果您的案例中没有参与者,那么您应该能够验证测试对象(执行doSomething的对象)的状态。

      Hmm稍微更改了代码以澄清情况。但是您的回答确实帮助了我:]我当然可以断言,在If()之后发生的任何事情,未设置。该行用于确保在myProperty为0时代码不会继续,将问题内容更改了一点以澄清。这对我来说已经很清楚了。您已经迈出了设计测试的第一步。可能有用于健全性检查的函数。如果您的数据管道可以在早期阶段进行此类检查,则您可以保存处理音调时间和资源。@AbhishekVelankar:Sanity checks在检查失败时会返回一些东西。我必须使用最后一个:]我习惯于测试代码中的每一点逻辑,因此也会显式测试每一个if()。但是由于这个if()不返回任何东西,我问自己如何处理。但是每当if()返回,在此之后的对象if()不变。
        verify(mockedActor).noMethodsCalled();
      
        assert(isPrestine(actor));