9

我正在尝试创建一个包装类来处理 HttpContext 的内容。我正在创建一个 cookie,但无法添加到 HttpContext.Request 或 Response cookie 集合。

我正在使用起订量。我也使用以下链接中的 MvcMockHelp: http ://www.hanselman.com/blog/ASPNETMVCSessionAtMix08TDDAndMvcMockHelpers.aspx

当我尝试在以下代码中添加到 Cookies 集合时:

        HttpContextBase c1 = MvcMockHelpers.FakeHttpContext();
        HttpCookie aCookie = new HttpCookie("userInfo");
        aCookie.Values["userName"] = "Tom";
        c1.Request.Cookies.Add(aCookie);    <------ Error here

我在代码的第 4 行 c1.Request.Cookies.Add(aCookie); 收到以下错误

Object reference not set to an instance of an object.

我也尝试过如下实例化上下文对象,但仍然没有运气

HttpContextBase c = MvcMockHelpers.FakeHttpContext
             ("~/script/directory/NAMES.ASP?city=irvine&state=ca&country=usa");

我看到 Request 中的 Cookies 集合为 NULL。我如何实例化它?

我也尝试了以下但没有运气。

c1.Request.Cookies["userName"].Value = "Tom";

请让我知道我做错了什么。

4

1 回答 1

8

查看 Hansleman 的代码,该Request属性被创建为 a Mock,但是,该模拟的属性没有设置,所以这就是为什么Cookies为 null,并且您不能设置它,因为它是一个只读属性。

你有两个选择:

  1. Cookies在方法中设置属性的模拟FakeHttpContext() ,或
  2. 如果您不想这样做,假设您直接引用库,那么您可以简单地HttpRequestBaseHttpContextBase您有权访问的库中重构模拟,如下所示:

    [Test]
    public void SetCookie()
    {
      var c1 = MvcMockHelpers.FakeHttpContext();
      var aCookie = new HttpCookie("userInfo");
      aCookie.Values["userName"] = "Tom";
    
      var mockedRequest = Mock.Get(c1.Request);
      mockedRequest.SetupGet(r => r.Cookies).Returns(new HttpCookieCollection());
      c1.Request.Cookies.Add(aCookie);
    
      Debug.WriteLine(c1.Request.Cookies["userInfo"].Value);
    }
    

    Mock.Get(object)将返回 Mock,然后您可以在其上设置 cookie 并使用它。

一般来说,您可以使用静态方法Object重新创建一个MockGet(MockedThing.Object)

于 2012-04-07T14:16:43.913 回答