[英]Mocking with NSubstitute, needing some clarity.
我对如何正确模拟对象有些困惑。 从我在NSubstitute的示例中所看到的,这是一个断言的基本设置。 我的理解是,这是关于测试该方法的行为的。 我的问题如下:
这是模拟获取设备主机名的正确方法吗?
[TestMethod] public void MockedDeviceHostName() { //Arrange var device = Substitute.For<IDeviceLogic>(); Device mockedDevice = new Device(); //Act device.GetHostName("IP Address","Object Identifier Repository","CommunityString").Returns(mockedDevice.hostName); //Assert Assert.AreEqual(mockedDevice.hostName, device.GetHostName("IP Address", "Object Identifier Repository", "CommunityString")); }
嘲笑的好处是什么。 我当然理解这是基于行为的测试,我的意思是说我正在设置行为期望,因此我认为即使这种方法存在错误,它们也总是正确的。 我希望在模拟vs单元测试和集成测试方面获得一些清晰度。
模拟通常用于替换类/对象的依赖项,以便可以独立于该依赖项来测试其逻辑。
在您的示例中,实际上没有一个类依赖于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()
,则您的模拟游戏将不会共享此行为,而无需进行其他工作。
希望这可以帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.