将Cookie添加到Request.Cookies集合中

时间:2012-04-06 16:11:00

标签: c# asp.net tdd moq httpcontext

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

我正在使用Moq。 另外我从以下链接使用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";

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

1 个答案:

答案 0 :(得分:8)

查看Hansleman的代码,Request属性创建为Mock,但是,该模拟的属性未设置,因此Cookies为空,并且您无法设置它,因为它是一个只读属性。

您有两种选择:

  1. Cookies中设置FakeHttpContext()属性的模拟 方法,或
  2. 如果您不想这样做,请说您直接引用该库,那么您只需从您有权访问的HttpRequestBase中重新构建模拟的HttpContextBase,就像这样:

    [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并使用它。

  3. 通常,您可以使用静态方法Object

    在其Mock中重新创建Get(MockedThing.Object)