Модульное тестирование HttpContext.GetOwinContext () - PullRequest
0 голосов
/ 25 июня 2018

Я только начал работать над созданием модульного теста для наших кодов.Мы используем ASP.NET MVC 4 и связующее ПО Owin для нашей аутентификации и других операций с данными и базами данных пользователей.

Итак, для начала у нас есть несколько контроллеров и контроллер на их основе.На основе контроллера мы добавили общие коды, такие как UserManager, RoleManager и т. Д. В этих кодах используется HttpContext.GetOwinContext.При реализации модульного теста на одном из контроллеров мне необходимо создать модульный тест базового контроллера, который я сейчас пытаюсь сделать.

Коды будут выглядеть так:

protected IAuditRepository Audit
{
    get { return _audit ?? (_audit = DependencyResolver.Current.GetService<IAuditRepository>()); }
}

protected UserManager UserManager
{
    get { return HttpContext.GetOwinContext().GetUserManager<UserManager>(); }
}

Итак, у меня есть исследование о том, как тестировать HttpContext.GetOwinContext, однако, большинство вещей, которые я вижу, неясно и не дает много информации для того, чтобы я смог создать тест.

Я пыталсяуспешно использовать Moq для внедрения зависимостей, однако я не смог в HttpContext.Пожалуйста, кто-нибудь может поставить меня на правильный путь, о, как проверить такие коды?

1 Ответ

0 голосов
/ 25 июня 2018

Как вы знаете, модульное тестирование помогает вам реорганизовать ваш код.

Вы пришли к точке, в которой вы видите, что ваш код связан, и вы зависите от HttpContext (медленно дышите, противник впередииз вас, но вы победите его скоро и гладко)

Теперь у вас есть подсказка о том, как его реорганизовать.Сделайте UserManager зависимостью и вставьте ее в конструктор контроллеров.

Затем вы сможете его смоделировать и в конечном итоге получите менее связанное решение.

Также вскоре вы увидите, что AuditManager получен с помощью Service Locator.Это доставит вам боль времени выполнения ошибок.Лучшим подходом будет также ввести его.

Это часть магии юнит-тестирования!

public class CustomController:BaseController /*Maybe you dont need BaseController anymore if it only provides you dependencies*/
{  
    protected UserManager _userManager{get;} //equals to readonly
    protected AuditManager _auditManager {get;} //equals to readonly

   public CustomController(IAuditManager auditManager,UserManager userManager)
   {
       _userManager=userManager;
       _auditManager=auditManager;
   }

}



//Unit test
[Test]
public void CustomController_WithMockedUserManager_IsAbleToTest()
{
      CustomController = new CustomController( yourMockedUserManager, yourMockedAuditManager);
     //Asserts...etc

}
...