这是我在代码中所拥有的:
function myMethod()
{
foreach(var file in files)
{
if (noMatch)
{
//
SendEmailAndStopProcessing();
continue;
}
doSomething();
}
}
我有一个具有多行的CSV文件,如果有一个与DB值的匹配,则我对其进行处理。
我想创建一个单元测试,该测试确认如果找到了nomatch,则将发送电子邮件,并且不会执行这些邮件。我在这里没有例外,因为没有必要,它是通过发送电子邮件来处理的(这些是业务规则)。但是,我需要创建一个单元测试以确认处理此情况。我应该如何处理?如果有例外,我会在测试方法中添加预期异常的属性,但是由于没有,我被卡住了。
任何功能都应在sendemailandstopprocessing()中发送电子邮件到接口(Iemailsender或其他内容)中,允许您通过类的构造函数注入该接口。<</
一旦拥有此功能,您就可以使用MOQ或其他模仿框架,用一个不会实际发送电子邮件的存根来替换Iemailsender实现。有了这些,您通常可以对调用一种方法的次数进行断言(例如
emailmock.verify(x => x.sendemail(),times.once)
如果未调用您的发送电子邮件,这将失败。您也可以为您的Orsomething方法做类似的事情。
钥匙是将组件隔离到界面中,以便使用liskov替代原则随意交换它们。
正如克里特纳所说的:创建一个 SendEmailAndStopProcessing
模拟并计数被调用的频率。当然,这假设可以模拟SendEmailAndStopProcessing
(可以从测试类访问方法,并且可以覆盖)。
例如,使用量:
using Moq;
// ARRANGE
var serviceMock = new Mock<MyService>();
serviceMock.Setup(s => s.SendEmailAndStopProcessing()).Verifiable();
// ACT: call myMethod()
// ASSERT
const int expectedNumberOfCalls = 1;
serviceMock.Verify(x => x.SendEmailAndStopProcessing(), Times.Exactly(expectedNumberOfCalls));