Как написать модульный тест C # для правильного покрытия кода в блоке try catch - PullRequest
0 голосов
/ 09 мая 2018

У меня есть следующий код:

public class MyControllerClass : ApiController  
{  
   private readonly IManager _manager;

   public MyControllerClass(IManager manager)
   {
     this._manager = manager;
   }

   pubic async Task<IHttpActionResult> GetRequest()  
   {  
     try  
       {  
         await this._manager.GetRequest();  
         return this.ok();  
       }  
     catch (Exception ex)  
      {  
         this.logger.Error("Error message", ex);  
         throw this.HTTPResponseException("Request failed message", ex);   
      }   
   }
} 

public class ManagerFake : IManagerFake  
{  
    public Task GetRequest()  
    {  
        return Task.FromResult(true);  
    }  
}     

Я использую NUnit для модульного тестирования. Для модульных тестов у меня есть класс FakeManager, зарегистрированный в моем контейнере IOC, который содержит метод GetResult () и просто возвращает Task.FromResult (true) при выполнении. Это позволяет выполнить логику в блоке try и, таким образом, обеспечить надлежащий охват кода для этого раздела.

Проблема, с которой я столкнулся, заключается в том, как создать тест с использованием того же класса FakeManager, который будет выдавать исключение, чтобы выполнялась логика блока catch и выполнялось покрытие кода, когда нет возможности сделать два уникальных вызова к методу GetRequest (), поскольку он не принимает входные параметры, которые можно использовать для различения двух разных вызовов?

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Вы, вероятно, хотите изучить фиктивные рамки (например, Moq: https://github.com/Moq/moq4).

Вместо написания класса (ов) ManagerFake, которые имитируют все поведение, которое вы ищете, вы можете просто имитировать поведение:

var mock = new Mock<IManager>();
mock.Setup(manager => manager.GetRequest())
    .ReturnsAsync(true);

и

var mock = new Mock<IManager>();
mock.Setup(manager => manager.GetRequest())
    .Throws(new HTTPResponseException( ... ));
0 голосов
/ 09 мая 2018

Вы не используете тот же класс ManagerFake, который возвращает true. Сделайте другую реализацию IManager, которая выдает ошибку.

Или используйте библиотеку фиктивных объектов, которая будет создавать экземпляры фиктивных объектов с тем же поведением, которое вы хотите в каждом тесте.

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