1

我在静态类中有这个静态方法:

public static class CookieHelper //:ICookieHelper
{
    public static void CreateCookie(string cookieName, int expireyDays)
    {
        HttpCookie cookie;
        cookie = HttpContext.Current.Response.Cookies[cookieName]; //Exception is here
        cookie.Expires.AddDays(expireyDays);
    }
}

我为它写了这个单元测试。运行此测试将生成 nullreferenceexception(对象引用未设置为 ...)。

[Test]
public void ShouldCreateCookieAndValidateNotNull()
{
    string newCookie = "testCookie";

    CookieHelper.CreateCookie(newCookie,5);

    string cookieValue = HttpContext.Current.Server.HtmlEncode(HttpContext.Current.Request[newCookie]);

    Assert.NotNull(cookieValue);
}

这总是在网络表单后面的代码中调用;从不在演示者层中。

我究竟做错了什么?

4

2 回答 2

1

您将实现与 HttpContext.Current 紧密耦合,这不是一个好主意。

我建议您重新创建您的助手以接受它用于创建 cookie 的HttpContextBase 。甚至HttpResponseBase,因为它根本不需要上下文。

然后,从您的控制器中,您可以使用当前控制器上下文(或响应)传递给帮助程序。

于 2013-09-24T17:00:52.407 回答
0

我相信您需要在测试初始化​​期间将其设置HttpContext.Current为新HttpContext的:HttpResponse

HttpContext.Current = new HttpContext(
    new HttpRequest("", "http://tempuri.org", "ip=127.0.0.1"),
    new HttpResponse(new StringWriter()))
    {
        User = new GenericPrincipal(
            new GenericIdentity("username"),
            new string[0]),
    };
于 2013-09-13T09:39:12.750 回答