C# 用于确保方法内部的方法未被调用的单元测试

C# 用于确保方法内部的方法未被调用的单元测试,c#,unit-testing,nunit,integration-testing,testcase,C#,Unit Testing,Nunit,Integration Testing,Testcase,我有如下两种方法 public bool IsSuccess() { // Some logi } public bool ShouldSendLogic() { var status = IsSuccess(); if(status) { SendInvoice(); // do some operation } return status; } 现在我正在编写集成/单元测试。我可以调用ShouldSendLogic,但我希望通过将Success设置为

我有如下两种方法

public bool IsSuccess()
{
   // Some logi
}

public bool ShouldSendLogic()
{
  var status = IsSuccess();
  if(status)
  {
    SendInvoice();
   // do some operation
  }
 return status;
}

现在我正在编写集成/单元测试。我可以调用ShouldSendLogic,但我希望通过将Success设置为false来确保未调用SendInvoice。(仅适用于否定的情况)。如何为此场景编写测试用例,请帮助我编写代码。

您可以更改
ShouldSendLogic()
以接受状态作为参数
bool ShouldSendLogic(bool status)
。这样,
ShouldSendLogic
就可以测试阳性和阴性情况

另一种方法是将
issucess()
作为接口的一部分,并将依赖项注入到具有
ShouldSendLogic()
的类中。
issucess()
结果可以由单元测试环境中的模型类修改,并且可以针对不同的状态值测试
ShouldSendLogic()

class MyClass
{

    ISomeInterface _interfaceObj;

    public MyClass(ISomeInterface interfaceObj)
    {
        _interfaceObj = interfaceObj;
    }

    public bool ShouldSendLogic()
    {
        var status = _interfaceObj.IsSuccess();
        if (status)
        {
            SendInvoice();
            // do some operation
        }
        return status;
    }
}
编辑

通过将检查接口成功与否的代码分离,您现在可以在单元测试中创建一个“mock”对象,在这里您可以决定issucess()的值应该是什么

e、 g

然后在单元测试的“排列”部分,您可以创建MockSuccessClass的实例并将其传递给SUT


您不必使用Moq,但如果您让Moq为您创建模拟类,这将节省时间。

是否
SendInvoice
会导致您可以测量的任何副作用?@SamIam:是的,根据上述逻辑,当状态为false时不应执行此逻辑,但它会导致任何副作用吗?它有什么作用?@SamIam:没有副作用它发送不应该发生的发票,还登录数据库。发送发票对我来说听起来像是副作用。为什么不确保您有办法接收已发送的发票,然后检查以确保发票未发送?或者,为什么不信任方法的返回值呢?如果没有一个好的答案来清楚地说明发生了什么,就不可能给出任何真实、具体的答案。事实上,当你调用一个方法时,你通常不会去监视,更不用说命令那个方法做什么了。如果您坚持根据这种行为(或缺乏这种行为)进行单元测试,则必须在代码中构建类似的内容。
public class MockSuccessClass : ISomeInterface
{
    public bool IsSuccess { return true; }
}