gpt4 book ai didi

c# - 类中接口(interface)之外的公共(public)方法

转载 作者:行者123 更新时间:2023-11-30 19:44:32 26 4
gpt4 key购买 nike

例子:

public interface IFoo
{
bool DoSomething();
}

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

public bool DoOtherThing()
{
...
}
}

我通常的 TDD 方法是对 DoSomething()DoOtherThing() 方法编写单元测试。但如果 DoOtherThing 是一个私有(private)方法,这将很难做到。我还读到过测试私有(private)方法是不行的。

为了促进代码覆盖和测试,在一个类上使用公共(public)方法是否被认为是可以接受的,即使该类的目的只是通过它的 (IFoo) 接口(interface)访问?通常我会将接口(interface)范围之外的方法作为私有(private)方法,但这不允许您有效地测试所有代码。使该方法公开允许您对 Foo 类进行正确的测试,但至少对我而言,拥有不从类外部调用的公共(public)方法似乎不正确。这种方式是否最适合 TDD,还是有更好的方式?

最佳答案

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

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

难以测试的东西通常表示存在设计缺陷。

更新

ok, so lets say you have a method for sending an email. Step 1 is generating a MailMessage class and populating it. Step 2 is sending the email

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

做类似的事情:

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

更新 2

就我而言,您不应该测试私有(private)方法的原因是质量衡量。如果您的测试覆盖率较低,您可能会违反一些基本原则 (SOLID)。

因此,最好花时间反射(reflection)类设计,而不是尝试测试私有(private)方法。

关于c# - 类中接口(interface)之外的公共(public)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12303740/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com