Unit testing .net核心Url.Action模拟,如何?
如何在测试控制器操作期间模拟Url.Action 我正在尝试对我的asp.net核心控制器操作进行单元测试。 动作逻辑有Url.action,我需要模拟它来完成测试,但我找不到正确的解决方案 谢谢你的帮助 更新 这是我在控制器中需要测试的方法Unit testing .net核心Url.Action模拟,如何?,unit-testing,asp.net-core-mvc,moq,Unit Testing,Asp.net Core Mvc,Moq,如何在测试控制器操作期间模拟Url.Action 我正在尝试对我的asp.net核心控制器操作进行单元测试。 动作逻辑有Url.action,我需要模拟它来完成测试,但我找不到正确的解决方案 谢谢你的帮助 更新 这是我在控制器中需要测试的方法 public async Task<IActionResult> Index(EmailConfirmationViewModel model) { if (ModelState.IsValid)
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);
}
我终于找到了解决办法 当您模拟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;
我补充说
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;
var urlHelperMock=new Mock();
urlHelperMock
.Setup(x=>x.Action(It.IsAny())
.Returns((UrlActionContext uac)=>
$“{uac.Controller}/{uac.Action}{uac.Fragment}”
+string.Join(“&”,新建RouteValueDictionary(uac.Values)。选择(p=>p.Key+“=”+p.Value));
controller.Url=urlHelperMock.Object;
到我的通用控制器设置。这有点粗糙,但意味着我可以测试生成链接的任何控制器逻辑。提供测试中的方法,以及您如何尝试测试它far@Nkosi非常感谢。我更新了我的帖子。我想知道你是否解决了这个问题,如果是,你是如何解决的。@Rianmoster,我解决了我的问题!请阅读我的答案,如果它解决了您的问题,请标记它。我能说什么,这是使用asp.net核心的“官方”Moq策略。谢谢@vladimir rodchenko
_controller.ControllerContext.HttpContext = new DefaultHttpContext();
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;