将Cookie添加到Request.Cookies集合中

dot*_*ner 7 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
Run Code Online (Sandbox Code Playgroud)

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

Object reference not set to an instance of an object.
Run Code Online (Sandbox Code Playgroud)

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

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

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

我也试过以下但没有运气.

c1.Request.Cookies["userName"].Value = "Tom";
Run Code Online (Sandbox Code Playgroud)

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

nic*_*s13 8

看看Hansleman的代码,该Request属性是作为一个创建的Mock,但是,该mock的属性没有设置,所以这就是为什么Cookies是null,你不能设置它,因为它是一个只读属性.

您有两种选择:

  1. CookiesFakeHttpContext() 方法中设置属性的模拟,或
  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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

一般来说,你可以重新创建一个Object到它Mock通过使用静态方法Get(MockedThing.Object)