gpt4 book ai didi

unit-testing - .net core Url.Action mock,怎么做?

转载 作者:行者123 更新时间:2023-12-04 09:00:54 24 4
gpt4 key购买 nike

如何在测试 Controller Action 期间模拟 Url.Action?

我正在尝试对我的 asp.net 核心 Controller 操作进行单元测试。
Action 逻辑有 Url.Action,我需要模拟它来完成测试,但我找不到正确的解决方案。

感谢您的帮助!

更新
这是我需要测试的 Controller 中的方法。

    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);
}

我在 mock 这部分时遇到问题:
var callbackUrl = Url.Action("Confirm", "EmailConfirmation", new { userId = user.Id, token }, HttpContext.Request.Scheme);

最佳答案

最后我找到了解决方案!

当您模拟 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;

还!由于 HttpContext.Request.Scheme 中的 null,我遇到了问题。你需要模拟 HttpContext
_controller.ControllerContext.HttpContext = new DefaultHttpContext();

关于unit-testing - .net core Url.Action mock,怎么做?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42212066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com