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

时间:2010-05-19 07:59:23

标签: c# unit-testing

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

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

6 个答案:

答案 0 :(得分:7)

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

如果您对这些问题找到了有价值的答案,您会发现有关测试代码的提示。

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

答案 1 :(得分:4)

无论您做什么,都需要针对可观察效果进行测试。当然你的方法必须做某事

使用基于状态的测试时,您可以在执行方法后检查SUTFixture的状态,以查看状态是否符合您的预期。

如果无法做到这一点,您需要执行Behavior Verification(又名基于交互的测试。这通常通过模拟对象来完成。

答案 2 :(得分:3)

您可以断言return 在<{1}}为零时发生后发生的任何事情。

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

myProperty

那么你的单元测试可以

  • 安排 if myProperty == 0 return myOtherProperty = 2 设置为零,myProperty设置为myOtherProperty以外的其他内容
  • 通过调用测试方法 行动
  • 断言 2仍设置为之前的设置。

答案 3 :(得分:1)

我认为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);
}

然后你的选择是模拟 SomeVerifiableClass 或用真实的测试。如果你正确使用DI,那么模拟是一个更好的选择。

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

  verify(mockedActor).noMethodsCalled();

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

  assert(isPrestine(actor));

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

答案 4 :(得分:0)

当我看到这个时,我问的问题是:当myProperty不为零时会发生什么?

此返回后是否有代码改变类级别/共享状态?你可以断言类级别/共享状态来验证行为吗?

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

的影响

答案 5 :(得分:0)

你没有发布方法签名,所以我认为它有返回类型的void。在这种情况下,没有办法像你指出的那样测试它;但是如果方法与对象范围属性交互,则可以测试它们以查看它们是否发生了变化。