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));