2016-08-01 5 views
-3

У меня есть два метода, как показано ниже.Единичный тест для обеспечения метода внутри метода не называется

public bool IsSuccess() 
{ 
    // Some logi 
} 

public bool ShouldSendLogic() 
{ 
    var status = IsSuccess(); 
    if(status) 
    { 
    SendInvoice(); 
    // do some operation 
    } 
return status; 
} 

Теперь я пишу интеграционные тесты. Я могу вызвать ShouldSendLogic, но я хочу, чтобы SendInvoice не вызывался, установив Success как false. (Только для отрицательного случая). Как написать тестовый пример для этого сценария, пожалуйста, помогите мне с кодом для этого.

+0

делает 'SendInvoice' причиной какого-либо побочного эффекта, который вы можете измерить? –

+0

@SamIam: Да, эта логика не должна выполняться, когда состояние ложно в соответствии с приведенной выше логикой – Learner

+0

, но вызывает ли это какие-либо побочные эффекты? Что оно делает? –

ответ

-2

Вы можете изменить ShouldSendLogic() для получения статуса как параметра bool ShouldSendLogic(bool status). Таким образом, ShouldSendLogic может быть проверен на наличие положительных и отрицательных случаев.

Еще один подход состоит в том, чтобы иметь часть интерфейса и вводить зависимость класса, который имеет ShouldSendLogic(). Результат IsSuccess() может быть изменен с помощью классов макета в единичной тестовой среде, а ShouldSendLogic() может быть протестирован на разные значения статуса.

class MyClass 
{ 

    ISomeInterface _interfaceObj; 

    public MyClass(ISomeInterface interfaceObj) 
    { 
     _interfaceObj = interfaceObj; 
    } 

    public bool ShouldSendLogic() 
    { 
     var status = _interfaceObj.IsSuccess(); 
     if (status) 
     { 
      SendInvoice(); 
      // do some operation 
     } 
     return status; 
    } 
} 

Редактировать

Разделяя код, который проверяет на успех на интерфейс, теперь вы можете создать «ложный» объект в модульных тестах, где вы можете решить, что значение IsSuccess () должно быть.

например.

public class MockSuccessClass : ISomeInterface 
{ 
    public bool IsSuccess { return true; } 
} 

И тогда в вашем разделе «Arrange» вашего модульного тестирования, вы можете создать экземпляр MockSuccessClass и передать его в SUT.

Вам не нужно использовать Moq, но это сэкономит ваше время, если вы разрешите Moq создавать свои классы Mock для вас.

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