2016-05-12 2 views
0

У меня появилось много вызовов функций, подобных приведенным ниже, которые я хочу выполнить с помощью модуля, но не уверены в том, как я должен обращаться к таким функциям. Я просто тестирую его с помощью реальные URL-адреса и API-вызовы? но тогда это не будет реальным модульным тестом, поскольку я включаю то, что я не контролирую ..., что приводит меня к выводу, что я должен высмеивать RestClient? где мне нужно сделать RestClient Foo(ApiUrl + ApiDirectory);, на котором я могу использовать NSubtitute, правильно?faking API calls/w NSubstitute, для модульного тестирования

Не могли бы вы поступить так же? или есть ли разумный способ выполнить этот модульный тест?

// ReSharper disable once InconsistentNaming 
public IRestResponse TCAPIconnection(Method b, long c = 0, object d = null) 
{ 
    var client = c == 0 ? new RestClient(ApiUrl + ApiDirectory) : new RestClient(ApiUrl + ApiDirectory + c); 
    var request = new RestRequest(b); 
    request.AddHeader("Authorization", Token); 
    if (d != null) 
    { 
     request.AddJsonBody(d); 
    } 
    var response = client.Execute(request); 
    return response; 
} 

ответ

1

Ваш подход при условии не собирается летать на большее в системе размера, а как вы на самом деле изменить исходный код для тестирования.

Сменные каркасы обычно используются для модульного тестирования. Единичный тест сам по себе представляет собой лишь небольшую часть функциональности, единственного метода. Это, безусловно, не связано с услугами.

Что вы должны делать, это абстракции, на которых вы можете просто высмеять interface, которые ваши службы используют.

Давайте рассмотрим небольшой пример. У вас есть IBluetoothService, который вводится в класс BluetoothManager. Интерфейс будет выставлять несколько методов, которые в тестовом режиме будут издеваться.

public interface IBluetoothService 
{ 
    object GetData(); 
    bool SendData(object request); 
} 

public class BluetoothAPI : IBluetoothService 
{ 
    public object GetData() 
    { 
     // API logic to get data. 
     return new object(); 
    } 

    public bool SendData(object request) 
    { 
     // API logic to send data. 
     return false; 
    } 
} 

В вашем Logger классе constructor вы должны вводить IBluetoothService.

public class Logger 
{ 
    private readonly IBluetoothService _bluetoothService; 
    public Logger(IBluetoothService bluetoothService) 
    { 
     _bluetoothService = bluetoothService; 
    } 

    public void LogData(string textToLog) 
    { 
     if (!_bluetoothService.SendData(textToLog)) 
      throw new ArgumentException("Could not log data"); 
    } 
} 

Так как вы получили этот уровень абстракции в своем приложении, вы фактически начинаете его тестировать.

public void SmokeTest() 
{ 
    var substitute = Substitute.For<IBluetoothService>(); 
    substitute.GetData().Returns(1); 
    // Swap true with false and test will fail. 
    substitute.SendData(Arg.Any<object>()).Returns(true); 
    var sut = new Logger(substitute); 
    try 
    { 
     sut.LogData("Some data to log"); 
    } 
    catch (ArgumentException ex) 
    { 
     Assert.Fail("Mocked API call returned wrong value."); 
    } 
} 

NSubstitute является мощным инструментом, который позволяет проверить все, если у вас есть правильная архитектура в вас приложении. Для достижения тестируемого кода вам мало что нужно, просто введите interface. Это не только позволяет вам иметь тестовый, но и более удобный подход к разработке программного обеспечения.