- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试编写一个通过的单元测试,但我的测试调用的方法调用了另一个使用 UrlHelper
类生成 URL 的方法。调用 urlHelper.Action
的结果一直返回 null
。
我已经尝试模拟(使用 Moq)所有组件,我认为这个 Controller 将需要能够让它工作,但我仍然得到 null
。
单元测试类
[TestFixtureSetUp]
public void Configure_Defaults()
{
var mockHttpContextBase = new Mock<HttpContextBase>();
var mockRequest = new Mock<HttpRequestBase>();
var mockControllerContext = new Mock<ControllerContext>();
var mockWebRoutingRequestContrext = new Mock<RequestContext>();
mockRequest
.Setup(request => request.Url)
.Returns(new Uri("http://dev.fleepos.local/Register"));
mockHttpContextBase
.Setup(httpContext => httpContext.Request)
.Returns(mockRequest.Object);
mockWebRoutingRequestContrext
.Setup(request => request.HttpContext)
.Returns(mockHttpContextBase.Object);
mockWebRoutingRequestContrext
.Setup(request => request.RouteData)
.Returns(new RouteData());
var urlHelper = new UrlHelper(mockWebRoutingRequestContrext.Object);
mockControllerContext
.Setup(controllerContext => controllerContext.HttpContext)
.Returns(mockHttpContextBase.Object);
_registerController = new RegisterController() {ControllerContext = mockControllerContext.Object, Url = urlHelper};
}
[Test]
public void Display_Validate_Account_Page_On_Successful_Registration()
{
//act
var result = (RedirectToRouteResult)_registerController.Register(_userRegisterationViewModel);
//assert
Assert.That(result.RouteValues["action"], Is.EqualTo("ValidateAccount"));
}
Controller Action 调用的 Controller 方法
private string GenerateActionLink(string actionName, string token, string username)
{
string validationLink = null;
if (Request.Url != null)
{
var urlHelper = new UrlHelper(ControllerContext.RequestContext);
validationLink = urlHelper.Action(actionName, "Register",
new { Token = token, Username = username },
Request.Url.Scheme);
}
return validationLink;
}
最佳答案
Controller 已经有一个 UrlHelper Url
属性,可以模拟它来做你想做的事。通过在 Controller 操作调用的 Controller 方法中创建一个 new UrlHelper
,就失去了替换 mock/fake 的机会。
首先更新controller action调用的controller方法使其测试友好
private string GenerateActionLink(string actionName, string token, string username) {
string validationLink = null;
if (Request.Url != null) {
validationLink = Url.Action(actionName, "Register",
new { Token = token, Username = username },
Request.Url.Scheme);
}
return validationLink;
}
现在 Controller 的 UrlHelper 有了更多的控制权。 UrlHelper 也可以被模拟并传递给 Controller 上下文
这是上面解释的最小完整示例。
[TestClass]
public class UrlHelperTest {
[TestMethod]
public void MockUrlHelper() {
//Arrange
var requestUrl = new Uri("http://myrequesturl");
var request = Mock.Of<HttpRequestBase>();
var requestMock = Mock.Get(request);
requestMock.Setup(m => m.Url).Returns(requestUrl);
var httpcontext = Mock.Of<HttpContextBase>();
var httpcontextSetup = Mock.Get(httpcontext);
httpcontextSetup.Setup(m => m.Request).Returns(request);
var actionName = "MyTargetActionName";
var expectedUrl = "http://myfakeactionurl.com";
var mockUrlHelper = new Mock<UrlHelper>();
mockUrlHelper
.Setup(m => m.Action(actionName, "Register", It.IsAny<object>(), It.IsAny<string>()))
.Returns(expectedUrl)
.Verifiable();
var sut = new MyController();
sut.Url = mockUrlHelper.Object;
sut.ControllerContext = new ControllerContext {
Controller = sut,
HttpContext = httpcontext,
};
//Act
var result = sut.MyAction();
//Assert
mockUrlHelper.Verify();
}
public class MyController : Controller {
[HttpPost]
public ActionResult MyAction() {
var link = GenerateActionLink("MyTargetActionName", string.Empty, string.Empty);
return View((object)link);
}
private string GenerateActionLink(string actionName, string token, string username) {
string validationLink = null;
if (Request.Url != null) {
var encodedToken = EncodedUrlParameter(token);
var url = Url.Action(actionName, "Register", new { Token = encodedToken, Username = username }, Request.Url.Scheme);
validationLink = url;
}
return validationLink;
}
private string EncodedUrlParameter(string token) {
return "Fake encoding";
}
}
}
关于c# - UrlHelper 模拟不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39292414/
查看 msdn(UrlHelper.Route,UrlHelper.Link),它们看起来完全相同。是否有理由使用其中之一? 最佳答案 Route() 返回相对 URI,Link() 返回绝对 URI
我正在尝试编写一个通过的单元测试,但我的测试调用的方法调用了另一个使用 UrlHelper 类生成 URL 的方法。调用 urlHelper.Action 的结果一直返回 null。 我已经尝试模拟(
如果我在 API 调用中调用 UrlHelper.Link,该 API 调用的参数与我尝试获取 URL 的 API 端点的可选参数匹配,则无论我如何尝试,UrlHelper.Link 都会返回一个包含
让我们看看在 RouteConfig.cs 中映射的这两条路由,一条有 guid,一条没有: // Non-guid route routes.MapPageRoute( name: null
我不明白,我有这个代码: return JavaScript(string.Format( "window.location = '{0}'", UrlHelper.GenerateCon
我在 Controller ApplicationsController 中有一个方法,我需要在其中获取操作方法的基本 URL: public ActionResult MyAction(string
我正在使用 ASP.NET MVC 3 和 NUnit。我正在尝试编写一个单元来测试我的一个辅助方法。这是: public static class UrlHelperAssetExtensions
在单元测试中,我正在使用 伪造 http 上下文 var fakeHttpContext = new Mock(); var controllerContext = new Mock(); co
尝试创建用于测试目的的 URLHelper 会引发 NullReferenceException。 例子: [Fact] public async void AuthenticateAsyncTest
我在我的 Web 应用程序中使用 Ninject,作为其中的一部分,我需要在驻留在单独程序集中的 UrlHelper 扩展方法中进行一些注入(inject)。我什至无法获得对内核的静态引用,因为显然库
我想创建一个基于 Action/Controller 名称 + 路由值的 Url。 我知道可以使用 UrlHelper.Action,但我以异步方式运行该方法,因此 HttpContext.Curre
我正在开发一个 MVC Web API 应用程序,我需要从许多不同设备(例如智能手机)上的 Web 浏览器访问该应用程序。在开发过程中,我希望能够在通过手机访问网站时进行调试。为此,我设置了 Fidd
我正在使用 UrlHelper 生成 URL,但是,当我调用方法 Action(action, controller, route) 时,我收到了 ArgumentNullException。 Url
我有一些单元测试来测试 WebApi 项目中的帖子,它是一个 WebApi 1.0 版本,我已经升级到 webapi 2.0,现在在尝试构建响应时,并添加新资源的位置 ApiController.Ur
您能否提供仅使用目标 Controller 和操作在操作过滤器中使用 Urlhelper.GenerateUrl 的示例? 最佳答案 var url = UrlHelper.GenerateUrl(n
我有一个无法解决的场景: 我正在尝试为 mvc 创建自己的自定义授权属性。我想添加的主要功能是能够更改用户不处于某个角色时重定向的位置。我不介意如果他们没有经过身份验证,系统会将它们发送回登录页面,但
我需要在我的应用程序启动时设置一堆路径和 URL,即在 global.asax 中。使用 UrlHelper.Content() 是最简单的方法,但它不可用。 那么如何在 global.asax 中获
当使用 URLHelp 或 Keyword 成员定义 Visual Studio 2010 SP1 中的 C# 代码片段时,url 和关键字不会显示在屏幕: 调用代码段时 在按 Tab 自动完成代码段
在 justmock 中,我们可以通过安排构造函数调用来返回模拟实例而不是实际实例 Mock.Arragne(()=>new MyClass(Arg.IsAny())).IgnoreInstance(
我是 ASP.NET Core 的新手,现在我正试图了解 UrlHelper 的一般工作原理。 在我的 Controller 中,我想为同一 Controller 中的另一个操作创建一个绝对 URL,
我是一名优秀的程序员,十分优秀!