- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我使用 Asp.netCore
并且以下代码是我需要通过 XUnit
测试的操作的一部分。问题是 URL
当我测试 Action 方法时它是空的。我如何模拟 URL
及其函数 RoutUrl
以返回我期望的 URL
。
var callbackUrl = Url.RouteUrl("ConfirmEmail", new { userId = user.Id, token }, Request.Scheme);
我也试过这段代码,但它根本不起作用。
string locationUrl = "http://location/";
var mockUrlHelper = new Mock<IUrlHelper>();
mockUrlHelper
.Setup(x => x.RoutUrl("ConfirmEmail", It.IsAny<object>(), It.IsAny<string>()))
.Returns(locationUrl);
_accountController.Url = mockUrlHelper.Object;
这是我正在测试的 Action 方法:
[HttpPost]
public async Task<JsonResult> SendEmailConfirmation(string email)
{
if (string.IsNullOrEmpty(email)) throw new Exception("Inavlid parameter");
var user = await _userManager.GetUserAsync(User);
if (user.Email.ToLower() == email.ToLower().Trim())
return Json(false);
user.EmailConfirmed = false;
user.Email = email;
await _userManager.UpdateAsync(user);
var token = await _userManager.GenerateChangeEmailTokenAsync(user, email);
var callbackUrl = Url.RouteUrl("ConfirmEmail", new { userId = user.Id, token }, Request.Scheme);
await _emailService.SendEmailConfirmationUserAsync(user.Email, user.FirstName, callbackUrl);
return Json(true);
}
这是我的测试:
[Fact]
public async Task SendEmailConfirmation_NewEmail_ShouldReturnTrue()
{
const string token = "TokenString";
var applicationUser = StubFactory.GetUser();
_userManagerMock
.Setup(x => x.GetUserAsync(It.IsAny<ClaimsPrincipal>()))
.ReturnsAsync(applicationUser);
_userManagerMock
.Setup(x => x.UpdateAsync(applicationUser))
.ReturnsAsync(IdentityResult.Success);
_userManagerMock
.Setup(x => x.GenerateChangeEmailTokenAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
.ReturnsAsync(token);
_emailServiceMock
.Setup(x => x.SendEmailConfirmationUserAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()))
.ReturnsAsync(It.IsAny<EmailResult>());
//ToDO Mock Url.RoutUrl
string locationUrl = "http://location/";
var mockUrlHelper = new Mock<IUrlHelper>();
mockUrlHelper
.Setup(x => x.RouteUrl("ConfirmEmail", It.IsAny<object>(), It.IsAny<string>()))
.Returns(locationUrl);
_accountController.Url = mockUrlHelper.Object;
var result = await _accountController.SendEmailConfirmation("newemail@something.com");
result.Value.ShouldBe(true);
_userManagerMock.Verify(x => x.GetUserAsync(It.IsAny<ClaimsPrincipal>()), Times.Once);
_userManagerMock.Verify(x => x.GenerateChangeEmailTokenAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()), Times.Once);
_emailServiceMock.Verify(x => x.SendEmailConfirmationUserAsync(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>()), Times.Once);
}
我在单元测试 session 中得到的错误消息:
System.ArgumentNullException
Value cannot be null.
Parameter name: helper
at Microsoft.AspNetCore.Mvc.UrlHelperExtensions.RouteUrl(IUrlHelper helper,
String routeName, Object values, String protocol)
最佳答案
您正在模拟的特定 RouteUrl
方法是一种扩展方法
/// <summary>
/// Generates a URL with an absolute path for the specified route <paramref name="routeName"/> and route
/// <paramref name="values"/>, which contains the specified <paramref name="protocol"/> to use.
/// </summary>
/// <param name="helper">The <see cref="IUrlHelper"/>.</param>
/// <param name="routeName">The name of the route that is used to generate URL.</param>
/// <param name="values">An object that contains route values.</param>
/// <param name="protocol">The protocol for the URL, such as "http" or "https".</param>
/// <returns>The generated URL.</returns>
public static string RouteUrl(
this IUrlHelper helper,
string routeName,
object values,
string protocol)
{
if (helper == null)
{
throw new ArgumentNullException(nameof(helper));
}
return helper.RouteUrl(routeName, values, protocol, host: null, fragment: null);
}
最终总结为 another extension method创建 UrlRouteContext
。
由于 Moq 无法模拟扩展方法,因此您需要模拟该类以使扩展方法流向完成
string locationUrl = "http://location/";
var mockUrlHelper = new Mock<IUrlHelper>();
mockUrlHelper
.Setup(x => x.RouteUrl(It.IsAny<UrlRouteContext>()))
.Returns(locationUrl);
关于c# - 模拟 Url.RouteUrl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45855999/
我有一种情况需要在 ASP.NET MVC 站点的 javascript 中跳转 url。 我们知道,我们可以在xx.cshtml中用@Url.RouteUrl("RouteName", new {
我使用此扩展创建一个 RouteUrl,并附加了当前查询字符串。这适用于两次或多次不具有相同键的查询字符串。 public static string CurrentQueryStringRouteU
这是我的mvc3应用程序的路由配置 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); routes.MapRoute( "Default",
我使用 Asp.netCore 并且以下代码是我需要通过 XUnit 测试的操作的一部分。问题是 URL当我测试 Action 方法时它是空的。我如何模拟 URL 及其函数 RoutUrl 以返回我期
我目前在我的网站上使用 global.asax 进行页面路由。 除了我有以下代码: //Home: routes.MapPageRoute("intro", String.Empty, "~/Defa
我在生产服务器中的应用程序有问题,因为网站使用 url 路由“http://productionserver.com/myAppName/controllerName/actionName”运行 我需
我有以下代码: @Url.RouteUrl("NewMessage", new { parentThreadId = Model.thread.id, cacheBustParam = current
我正在使用 ASP.NET 4(Web 表单,而不是 MVC)中的新路由功能。现在我有一个绑定(bind)到数据源的 asp:ListView。其中一个属性是 ClientID我想用它从 ListVi
我尝试在 JavaScript 中将 URLHelp.RouteUrl 与动态字符串一起使用。我想要这样 - function MyFun(action, param){ var strPass
我正在扩展 Html.HtmlHelper 以根据我所在的页面呈现面包屑: public static HtmlString RenderBreadCrumb(this HtmlHelper help
我正在尝试获取完整的 URL,但是 RouteUrl正在返回空。 在 View 中,我是这样调用的: alert('@Url.RouteUrl("Api", new { controller = "P
我需要根据参数创建一个路由 URL 作为 JSON 返回值的一部分。 与 Url.RouteUrl 等效但在 Controller 代码内部使用的是什么,因此,我可以在 Json 结果中返回一个包含
我正在为路线构建 UrlHelper如best practices 问题是返回值总是为null调试时发现 Url.RouteUrl("x") 返回 null Url.RouteCollection["
我正在使用 Asp.Net MVC 2 - RC w/Areas。 由于在两个不同的区域有相同的 Controller 名称,我收到了一个模糊的 Controller 名称异常。 我已阅读 Phil
(我使用的是 ASP.NET MVC 2。) 使用 Url.RouteUrl(object) 时如何排除某些属性进入查询字符串? 具体来说,在传递给我的 View 的模型对象中,我有一个字符串数组(技
作为旁注,我了解整个 ambiguous controller names问题并使用命名空间来使我的路线正常工作,所以我认为这不是问题。 到目前为止,我有我的项目级 Controller ,然后是具有
假设您有一个操作方法来在购物车中显示产品 // ProductsController.cs public ActionMethod Index(string gender) { //
生成链接时,代码在 Controller 的 Indexx 中。所以链接是以这种形式生成的 Wk/Index/XX/YYYY 网址代码是 url = urlHelper.RouteUrl("Wk",
我有路线 // Sample URL: /Fixtures/Team/id routes.MapRoute( "Fixtures-by-TeamID", "Fixtures/Tea
我有以下 Controller ,它允许我使用以/api/v1/report/123.csv 结尾的 URL 通过 CSV 下载文件: [RoutePrefix("api/v{version:int?
我是一名优秀的程序员,十分优秀!