gpt4 book ai didi

c# - 使用两个函数进行单元测试

转载 作者:太空狗 更新时间:2023-10-29 20:20:41 24 4
gpt4 key购买 nike

我已经有一段时间忽略了单元测试。我写了单元测试,但它们很差。我现在正在通读“单元测试的艺术”,以使自己从零开始。

如果我有这样的界面:

public interface INotificationService
{
void AddError(string _error);
void AddIssue(string _issue);

IEnumerable<string> FetchErrors();
IEnumerable<string> FetchIssues();
}

该接口(interface)的具体实现包括:

    private readonly ICollection<Message> messages;

添加错误或问题会创建一条新消息,其中包含表示其类型的枚举并将其添加到集合中。调用 FetchErrors()/FetchIssues() 从集合中返回该类型的消息。

下面的测试是否有效?

    [Test]
public void FetchErrors_LoggingEnabledAddErrorFetchErrors_ReturnsError()
{
notificationService = new NotificationService();
notificationService.AddError("A new error");

Assert.AreEqual(new []{"A new error"}, notificationService.FetchErrors());
}

我担心的是我首先调用 AddError(),然后测试 FetchErrors() 的结果。所以我调用了两个函数。这是不正确的吗?

我是否应该公开该集合并直接断言它包含一条包含已记录错误消息的适当类型的消息?

在这种情况下,最佳做法是什么?

最佳答案

您的方法看起来不错 - 通过公共(public)方法测试实现是设计中唯一可用的访问方式。

为了相互独立地测试这些方法,您需要使用像反射这样的白盒测试后门来访问私有(private)消息,以确保各自的 Add*方法有效。这根本不是一个好主意,因为每次底层 CUT 实现发生变化时,您的测试都会(在运行时)中断。

一个常见的、更好的反射替代方法是公开一个非接口(interface) internal被测具体类上的方法允许您通过某种“维护舱口”访问 ICollection<Message> messages;实现字段,然后允许 InternalsVisibleTo 访问单元测试程序集。

一个注释 - 你会发现 Assert.AreEqual在可枚举的字符串上将进行引用比较并因此失败(因为您正在将它与新数组进行比较)。

您可能必须将其更改为类似以下内容:

Assert.IsTrue(notificationService.FetchErrors().Contains("A new error"));

编辑

IMO,你不需要走那么远的路public在.Net 中。因为你已经有了接口(interface)抽象,理论上应该限制对 CUT 的访问方式,所以使用 internal 是很常见的。范围和 InternalsVisibleTo允许 UT 特殊访问。 Jon Skeet 等人有 mentioned this here

#region Unit Testing side-door
internal ICollection<Message> Messages
{
get { return _messages };
// No Setter
}
#endregion

关于c# - 使用两个函数进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20700977/

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