类中接口外的公共方法

Mat*_*ips 2 c# testing tdd unit-testing

例:

public interface IFoo
{
    bool DoSomething();
}

public class Foo:IFoo
{
    public bool DoSomething()
    {
        var result = DoOtherThing();
        ...
        return result;
    }

    public bool DoOtherThing()
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的正常TDD方法是在方法DoSomething()DoOtherThing()方法上编写单元测试.但如果DoOtherThing是私有方法,这将很难做到.我还读过,测试私有方法是禁止的.

是否可以在类上使用公共方法以便于代码覆盖和测试,即使只能通过其(IFoo)接口访问类的目的?通常我会将超出接口范围的方法作为私有方法,但这不允许您有效地测试所有代码.使方法公开允许您对Foo类进行正确的测试,但至少对我来说,拥有不从类外部调用的公共方法似乎是不正确的.这种方式对TDD来说是最好的还是有更好的方法?

jga*_*fin 6

公共方法是公开的,因为它们应该是可访问的 如果不打算从外部调用它,请将其设为私有.

如果您未能获得代码覆盖率,您可能希望将您的类分解为多个类并使用组合代替.

难以测试的事情通常表明存在设计缺陷.

更新

好吧,让我们假设您有一种发送电子邮件的方法.第1步是生成一个MailMessage类并填充它.第2步是发送电子邮件

这是两个责任(SRP).撰写电子邮件并实际发送.我不会在同一个班级那样做.如果您的所有电子邮件类组成他们的邮件然后发送它们,它也将是代码重复.你如何处理网络故障?你也复制了那些支票吗?

做类似的事情:

public class SendWelcomeEmailComposer
{
    MailMessage Compose(User user)
}

public class EmailSender
{
    void SendEmail(MailMessage);
}

public class EmailService
{
    void SendWelcomeEmail(User user)
    {
        // compose email
        // and send using the classes above.
    }
}
Run Code Online (Sandbox Code Playgroud)

更新2

为什么你不应该测试私有方法的原因是我关注质量测量.如果你的测试覆盖率很低,你可能会违反一些基本原则(SOLID).

因此,最好花时间反思课程设计而不是尝试测试私有方法.

  • 那么任务是"撰写和发送电子邮件"?注意"和".不太稳固.SOLID会产生较小的类.这反过来又使它们更容易重用和测试.在这种情况下,组合使您可以测试以前的私有方法,因为它们在新类中是公共的(因为它们是该接口的一部分) (2认同)