2012-04-06 59 views
7

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

我使用起订量。 还有我使用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 

我得到的代码C1的4号线下面的错误。 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"); 

我看到里面请求Cookies集合为NULL。我如何实例化它?

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

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

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

+0

检查,看是否饼干为null重新创建Object到其Mock,如果是这样,实例化。 – Landern 2012-04-06 16:22:05

+0

我无法实例化饼干。我能得到的样品,如果可能的实例c1.Request.Cookies代码? – 2012-04-06 16:27:00

+0

你能否使用这个构造函数实例化:'FakeHttpContext(string url)'而不是?传递请求的URL;也许它会帮助实例化你的Request对象。 – 2012-04-06 16:32:20

回答

8

看着Hansleman的代码中,Request属性被创建为Mock,然而,模拟的性能都没有安装,所以这就是为什么Cookies是空的,你不能对它进行设置,因为它是一个只读只有财产。

你有两个选择:

  1. 设置在FakeHttpContext() 方法Cookies属性的模拟,或
  2. 如果你不想做,说你引用库直接,那么你可以简单地重建从您可以访问,像这样的HttpContextBase嘲笑HttpRequestBase

    [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)将返回你的模拟,然后你可以设置你的饼干,并使用它。

一般来说,你可以使用静态方法Get(MockedThing.Object)

+0

对不起'a',我看不到如何直接从列表中获得代码块。 – nicodemus13 2012-04-07 14:17:40

+0

该代码仅用于列表的第2部分,所以它*应该*成为它的一部分,这是通过缩进8个空格而不是4个来实现的。 – ErikE 2016-03-03 23:05:58