gpt4 book ai didi

c# - 挣扎于起订量 - 在被测方法中使用起订量

转载 作者:行者123 更新时间:2023-12-04 15:20:17 25 4
gpt4 key购买 nike

在我的系统中,我有一个单例类,负责列出和取消列出一系列 USB 设备。这个类是“InterfaceHandler”。
现在,我正在尝试测试此类并且可能需要使用 Mocking(在本例中为 Moq)。
除其他外,InterfaceHandler 必须实例化检测到的任何硬件接口(interface)。这是在名为“CreateCommunicationInterface()”的方法中完成的,如下所示:

public class InterfaceHandler {
public IHardware Hardware { get; set; }

private InterfaceHandler() {}

private static InterfaceHandler _instance;
public static InterfaceHandler Instance() => (_instance) ?? (_instance = new InterfaceHandler());

public IHardware CreateCommunicationInterface(HardwareType detectedHardwareType) {
try {
lock (locker) {
// Create and initialise hardware interface
switch (detectedHardwareType) {
case "Harware0":
Hardware = new HW0();
break;
case "Harware1":
Hardware = new HW1();
break;
case "SimHarware":
Hardware = new Simulator();
break;
default:
throw new Exception("Unknown Hardware Interface");
}

// Do something with this Hardware
}
} catch (Exception ex) {
string errorMessage = LogUtils.ComposeErrorMessage(ex, $"Could not create communication interface.");
Logger.Error(errorMessage);
}

return Hardware;
}
}

我在这里遇到的问题是,如果我要创建单元测试并为每个接口(interface)(HW0、HW1 和模拟器)创建 Moq,CreateCommunicationInterface() 将无法使用这些 Moq 'ed 对象(用于测试 CreateCommunicationInterface())。
我看到在很多情况下,人们在构造时注入(inject)一个接口(interface),但在这种情况下,我们不知道在构造时需要实例化什么,所以我不确定要遵循什么方法。
非常感谢任何指导。

最佳答案

您在这里应该问的问题是要测试什么。

让我们定义单位:您的单位将是适当对象的构造。

对象本身将在另一个专门为此制作的单元测试类中进行测试。所以你会有

  1. 一个 HW0 测试类
  2. HW1 测试类
  3. 等等

因此在您的单元测试中,根据输入,您检查返回的实例是否属于正确的类型,然后您就完成了它。

现在,如果你想测试消费者,你需要模拟 InterfaceHandler

为此,您需要声明一个新接口(interface) IInterfaceHandler,并将 CreateCommunicationInterface 函数作为成员,并让 InterfaceHandler 实现它。然后,无论您的单例实现如何,您都可以控制流程。

还有一点。您真的需要以下行吗?

   public IHardware Hardware { get; set; }

因为它是一个单例,那么如果多个线程使用它并且可能用于不同的硬件,您可能会遇到奇怪的结果,总是将最新的接口(interface)分配给成员变量。

关于c# - 挣扎于起订量 - 在被测方法中使用起订量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63450865/

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