用于处理异常的单元测试



这是我在代码中所拥有的:

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

最新更新