Как да напиша модулен тест на C# за правилно покритие на кода в блока try catch

Имам следния код:

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 (), тъй като не приема входни параметри, които биха могли да се използват за разграничаване на двете различни повиквания?


person Jason    schedule 09.05.2018    source източник
comment
Вие не връщате изключение, вие го хвърляте, така че направете вашия макет .GetRequest() метод да хвърля изключение.   -  person Lasse V. Karlsen    schedule 09.05.2018


Отговори (2)


Вие не използвате същия клас ManagerFake, който връща true. Направете различна реализация на IManager, която извежда грешка.

Или използвайте библиотека с фалшиви обекти, която ще създаде екземпляри на фалшив обект с точно поведението, което желаете във всеки тест.

person Eric King    schedule 09.05.2018
comment
Имам ограничен опит с Mock, така че съм любопитен дали действителният метод на конкретния клас се изпълнява или просто се подигравате на поведението на споменатия метод? Трябва да получа кодово покритие за въпросния метод. - person Jason; 10.05.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( ... ));
person Wireless    schedule 09.05.2018