2016-09-08 2 views
0

Я немного смущен о том, как правильно издеваться над объектом. Из того, что я видел в примере на NSubstitute, это базовая установка для assert. Мое понимание заключается в проверке поведения метода. Мои вопросы таковы:Издевательство над 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. В чем преимущество насмешек. Я, конечно, понимаю, что это тестирование на основе поведения, я имею в виду, что я устанавливаю ожидания поведения, поэтому считаю, что они всегда будут правильными, даже если в этом случае есть ошибка с этим методом. Я ищу немного ясности в насмешливых тестах модулей и интеграции.

ответ

0

Mocking обычно используется для замены зависимости класса/объекта, чтобы его логику можно было тестировать изолированно от этой зависимости.

В вашем примере нет действительно класса, полагающегося на насмешку 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). И мы можем сделать тесты быстрее (например, устройство может занять 30 секунд для подключения - мы можем издеваться над этим, чтобы имитировать его соединение сразу).

Недостаток заключается в том, что мы только моделируем зависимости - если реальная вещь действует по-другому, наш тест хуже, чем бесполезен. Например, если вам нужно позвонить device.Connect() на реальном устройстве до того, как имя хоста станет доступным, ваш макет не будет делиться этим поведением без дополнительной работы.

Надеюсь, это поможет.

+0

Спасибо :) Это действительно помогает :) – Mdukes00

Смежные вопросы