2017-02-13 11 views
1

Как издеваться над Url.Action во время проверки действия контроллера?.net core Url.Action макет, как?

Я пытаюсь выполнить тестирование моего основного контроллера ядра asp.net. Логика действия имеет Url.Action, и мне нужно высмеять ее для завершения теста, но я не могу найти правильное решение.

Благодарим за помощь!

ОБНОВЛЕНИЕ Это мой метод в контроллере, который мне нужно проверить.

public async Task<IActionResult> Index(EmailConfirmationViewModel model) 
    { 
     if (ModelState.IsValid) 
     { 
      var user = await _userManager.FindByNameAsync(model.Email); 

      if (user == null) return RedirectToAction("UserNotFound"); 
      if (await _userManager.IsEmailConfirmedAsync(user)) return RedirectToAction("IsAlreadyConfirmed"); 

      var token = await _userManager.GenerateEmailConfirmationTokenAsync(user); 
      var callbackUrl = Url.Action("Confirm", "EmailConfirmation", new { userId = user.Id, token }, HttpContext.Request.Scheme); 

      await _emailService.SendEmailConfirmationTokenAsync(user, callbackUrl); 

      return RedirectToAction("EmailSent"); 
     } 

     return View(model); 
    } 

У меня проблема с насмешливым эту часть:

var callbackUrl = Url.Action("Confirm", "EmailConfirmation", new { userId = user.Id, token }, HttpContext.Request.Scheme); 
+0

Предоставить [mcve] метода испытания и как вы пытались его протестировать до сих пор – Nkosi

+0

@Nkosi, спасибо! Я обновляю свой пост –

+0

Хотелось бы узнать, разрешили ли вы эту проблему, и если да, то как вы ее разрешили. –

ответ

10

Наконец я нашел решение!

Когда вы издеваетесь над UrlHelper, вам нужно высмеять только базовый метод Url.Action (контекст UrlActionContext), потому что все вспомогательные методы на самом деле его используют.

 var mockUrlHelper = new Mock<IUrlHelper>(MockBehavior.Strict); 
     mockUrlHelper 
      .Setup(
       x => x.Action(
        It.IsAny<UrlActionContext>() 
       ) 
      ) 
      .Returns("callbackUrl") 
      .Verifiable(); 

     _controller.Url = mockUrlHelper.Object; 

Также! У меня проблема из-за null в HttpContext.Request.Scheme. Вам нужно издеваться HttpContext

_controller.ControllerContext.HttpContext = new DefaultHttpContext(); 
+2

Владимир, спасибо, мой друг, ты спас мой день <3 :)! – FreedomDeveloper

+0

Что я могу сказать, это «официальная» стратегия Moq с использованием ядра asp.net. Спасибо @ vladimir-rodchenko – Raffaeu

0

Я добавил

var urlHelperMock = new Mock<IUrlHelper>(); 
urlHelperMock 
    .Setup(x => x.Action(It.IsAny<UrlActionContext>())) 
    .Returns((UrlActionContext uac) => 
    $"{uac.Controller}/{uac.Action}#{uac.Fragment}?" 
    + string.Join("&", new RouteValueDictionary(uac.Values).Select(p => p.Key + "=" + p.Value))); 
controller.Url = urlHelperMock.Object; 

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

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

  • Нет связанных вопросов^_^