测试在不发送邮件的情况下发送电子邮件的方法

Ste*_*ers 3 c# unit-testing

我有一个方法

public abstract class Base
{
    public void MethodUnderTest();
}

public class ClassUnderTest : Base
{
    public override MethodUnderTest()
    {
        if(condition)
        {
            IMail mail = new Mail() { /* ... */ };
            IMailer mailer = new Mailer() { /* ... */ }

            mailer.Send(mail);
        }
        else
        {
            /* ... */
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我有这个方法的单元测试,邮件被发送到我自己,所以它并不可怕(比没有测试更好),但我不想发送邮件.

  • 我遇到的问题是我不希望类中的测试特定代码(即if(testMode)返回;而不是发送邮件)
  • 我不太了解DI,但我考虑将模拟IMailer传递给MethodUnderTest,除了它覆盖基类,并且没有其他派生自Base的类需要一个IMailer对象(我不想强迫Base的实现者)在MethodUnderTest中使用不必要的IMailer)

我还可以做些什么?

(注意:IMail和IMailer是发送电子邮件的外部库的一部分.它是内部编写的,所以我可以根据需要修改它,尽管在这种情况下我看不到需要)

Jef*_*nal 7

使用依赖注入的标准方法是需要IMailerin ClassUnderTests的构造函数.如果您这样做,则将模拟邮件程序传递给您的测试,并且基类不需要了解有关邮件或邮件程序的任何信息.

如果由于某种原因这是不合需要的(这通常只在你不控制底层类时才有意义),你可以使用setter injection("property injection").