繁体   English   中英

用NSubstitute模拟,需要一些澄清。

[英]Mocking with NSubstitute, needing some clarity.

我对如何正确模拟对象有些困惑。 从我在NSubstitute的示例中所看到的,这是一个断言的基本设置。 我的理解是,这是关于测试该方法的行为的。 我的问题如下:

  1. 这是模拟获取设备主机名的正确方法吗?

     [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")); } 
  2. 嘲笑的好处是什么。 我当然理解这是基于行为的测试,我的意思是说我正在设置行为期望,因此我认为即使这种方法存在错误,它们也总是正确的。 我希望在模拟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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM