Rom*_*man 5 asp.net asp.net-mvc asp.net-mvc-2
我有一个线程可以发送电子邮件。我需要生成 ActionLinks 作为电子邮件内容的一部分,以便用户可以单击链接并重定向到网站,准确地转到所需的页面。我尝试实例化一个UrlHelper
类并使用它的Action
方法来生成链接,但由于线程不在任何请求的上下文中运行,因此我在生成 ActionLink 时遇到异常。
我怎样才能做到这一点?
您需要伪造 HttpContextBase 并将其传递给 UrlHelper,您可以在没有 HttpContext 的线程中使用它。这是粗略的想法,尽管您需要围绕它创建一个类等,但这是一个快速的概念证明,因为单元测试也没有 HttpContext。
[TestFixture]
public class RouteTestClass
{
private UrlHelper helper;
public RouteTestClass()
{
MvcApplication.RegisterRoutes(RouteTable.Routes); //You dont need to do this if its done in global.asax!
var c = new RequestContext(new FakeContext(), new RouteData());
helper = new UrlHelper(c, RouteTable.Routes);
}
[Test]
public void TestGetHomeIndex()
{
var url = helper.Action("Index", "Home");
Assert.AreEqual("/",url);
}
}
public class FakeContext : HttpContextBase
{
public override HttpRequestBase Request { get { return new FakeRequest(); } }
public override HttpResponseBase Response { get { return new FakeResponse(); } }
}
public class FakeRequest : HttpRequestBase
{
public override string ApplicationPath { get { return "/"; } }
public override NameValueCollection ServerVariables { get { return new NameValueCollection(); } }
}
public class FakeResponse : HttpResponseBase
{
public override string ApplyAppPathModifier(string virtualPath)
{
return virtualPath;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑
看着这个答案,我整理了一些代码,因为我不需要自己为 HttpRequestBase 和 HttpResponseBase 创建假货。
[TestFixture]
public class RouteTestClass
{
private UrlHelper helper;
public RouteTestClass()
{
MvcApplication.RegisterRoutes(RouteTable.Routes);
var req = new HttpRequest("/", "http://www.yoururl.com", "");
var resp = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(req, resp);
var c = new RequestContext(new HttpContextWrapper(httpContext), new RouteData());
helper = new UrlHelper(c, RouteTable.Routes);
}
[Test]
public void TestGetHomeIndex()
{
var url = helper.Action("Index", "Home");
Assert.AreEqual("/",url);
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
315 次 |
最近记录: |