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