gpt4 book ai didi

c# - 关于模拟框架 C# 和单元测试的问题

转载 作者:行者123 更新时间:2023-11-30 22:38:02 24 4
gpt4 key购买 nike

我有一个读取 pop3 电子邮件服务器的类。我想为包含类编写一些单元测试,所以我需要模拟 POP3 服务器类。我正在使用 OpenPOP.Net。所以我有一个这样的构造函数:

EmailHost(string email, string password, string pop3Address, int port)
... etc....

然后我有一个连接类:

private void Connect()
{
_pop3 = new Pop3Client();
etc...

所以对 Pop 客户端的引用被埋在类的内部。为了能够模拟它,我需要做一些时髦的事情,因为在 Pop3Client 上使 EmailHost 成为通用的,或者添加一些默认的函数来执行上面的行:

 public EmailHost<PopClass>(...)

public EmailHost(... params, Func popGenerate = () => new Pop3Client())

所以看来我必须对我的构造函数做出一点妥协才能使其与 mock 一起工作。 (显然我会定义一个 IPop3Client 等等。)

关于如何正确执行此操作的任何想法?

编辑:

jOk 提供了一个有趣的答案,问题是它不太适合我正在做的事情的结构。在这种特殊情况下,我需要在 Pop 客户端中处理多个电子邮件地址,并且这些地址是动态添加的。因此,当您添加每个电子邮件地址时,您需要创建一个新的 Pop3Client。另外,我想隐藏 POP3 本身的实现,这样他们的用户就不需要尽可能多地了解它。

对此还有其他想法吗?

顺便说一句,感谢您的输入。

最佳答案

我认为你很接近。

与其传入最终将用于创建 Pop3Client 实例的所有参数,不如考虑注入(inject) Pop3Client 实例。

public EmailHost(IPop3Client client) {

}

通过这样做,您将 EmailHost 类从创建 Pop3Client 对象的责任中移除。这种责任被转移到其他地方,最常见的是转移到 IoC 容器。

我无法从您发布的代码中判断 Pop3Client 是否基于接口(interface)。如果是,很好,您可以在测试中模拟/ stub 它并注入(inject)依赖项。如果不是,那么在操纵它时需要做更多的工作,以便它能在这种情况下工作。它可以像围绕公开您在 EmailHost 内部使用的方法的类编写包装器(和相应的接口(interface))一样简单。然后可以在上面的示例中使用它代替 IPop3Client。

这有意义吗?如果您需要更多指导,请告诉我。

关于c# - 关于模拟框架 C# 和单元测试的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283748/

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