gpt4 book ai didi

c# - 如何使用 Moq 测试没有返回值的方法?

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

这是我的第一个问题,所以请客气! :)

我想做的是为管理器类编写一些测试,在构建过程中将单个项目类的许多新实例添加到列表中。在此管理器类中调用 UpdateAllItems 时,目的是迭代列表并在每个项目上调用 Increment。

管理器类是我的代码,但单项类不是我无法修改。

我将 NUnit 用作测试框架,并开始使用 Moq。因为管理器类使用单个项目类,所以我认为我需要使用最小起订量,所以我只测试管理器,而不是单个项目。

如何为我的 UpdateAllItems 方法编写测试? (从技术上讲,我应该先编写测试,我知道)。

这是一些示例代码,可以大致了解我正在使用的内容......

public class SingleItem_CodeCantBeModified
{
public int CurrentValue { get; private set; }

public SingleItem_CodeCantBeModified(int startValue)
{
CurrentValue = startValue;
}

public void Increment()
{
CurrentValue++;
}
}

public class SingleItemManager
{
List<SingleItem_CodeCantBeModified> items = new List<SingleItem_CodeCantBeModified>();

public SingleItemManager()
{
items.Add(new SingleItem_CodeCantBeModified(100));
items.Add(new SingleItem_CodeCantBeModified(200));
}

public void UpdateAllItems()
{
items.ForEach(item => item.Increment());
}
}

在此先感谢您的所有帮助!

最佳答案

简单的回答是,你不能。 UpdateAllItems 调用的方法 (Increment()) 是非虚拟的,因此您无法模拟它。

在我看来,您的选择是:

  • 根本不要测试 UpdateAllItems。它的实现很简单,因此这是一个可以考虑的选项(尽管并不理想)。
  • 在您的测试中创建真实的 SingleItem_CodeCantBeModified 实例。纯粹主义者会说此时您不再有单元测试,但它仍然可能是一个有用的测试。
  • 添加一个 ISingleItem 接口(interface)和一个 SingleItemAdapter : ISingleItem 类,该类保留对 SingleItem_CodeCantBeModified 的引用并转发调用。然后您可以编写 SingleItemManager 来对 ISingleItem 进行操作,并且您可以在测试中自由地传入模拟 ISingleItem。 (根据您的系统设置方式,您甚至可以继承 SingleItem_CodeCantBeModified,在您的后代上实现接口(interface),并使用这些对象而不是编写适配器。)

最后一个选项为您提供了最多的选择,但代价是有些复杂。选择最适合您要实现的目标的选项。

关于c# - 如何使用 Moq 测试没有返回值的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7283521/

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