我对如何正确模拟对象感到困惑。从我在NSubstitute的例子中看到的,这是断言的基本设置。我的理解是这是关于测试方法的行为。我的问题如下:
这是模拟获取设备主机名的正确方法吗?
response.data
嘲笑有什么好处。我当然明白这是基于行为的测试,我的意思是说我设置行为期望所以我觉得即使在这种情况下方法有错误,它们也总是正确的。我正在寻找一些关于模拟与单元测试和集成测试的清晰度。
答案 0 :(得分:0)
模拟通常用于替换类/对象的依赖项,以便可以独立于该依赖项测试其逻辑。
在您的示例中,并非真正依赖于模拟IDeviceLogic
的类。更接近的示例可能是需要显示有关设备的信息的表单。在这种情况下,在不附加真实设备的情况下运行表单逻辑的基本测试会很不错。
[Test]
public void SetDeviceNameOnLoad() {
//Arrange
var device = Substitute.For<IDeviceLogic>();
var view = Substitute.For<IDeviceView>();
var form = new DevicePresenter(device, deviceView);
device.GetHostName("IP Address","Object Identifier Repository","CommunityString").Returns("sample device name");
//Act
form.Load();
//Assert
Assert.AreEqual("sample device name", view.DeviceName);
}
这样做的一个优点是我们可以从瞬态条件中隔离出我们想要测试的逻辑(例如,设备可能断开连接,网络可能会关闭等)。我们还可以模拟可能难以可靠的自动化测试的条件(例如,我们模拟返回特定HTTP状态代码的Web服务)。我们可以更快地进行测试(例如,设备可能需要30秒才能连接 - 我们可以模拟它来模拟它立即连接)。
缺点是我们只是模拟依赖 - 如果真实的行为不同,我们的测试比无用更糟糕。例如,如果您必须在主机名可用之前在真实设备上调用device.Connect()
,那么如果没有额外的工作,您的模拟将不会共享此行为。
希望这有帮助。