我正在尝试创建一个包装类来处理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";
请让我知道我做错了什么。
答案 0 :(得分:8)
查看Hansleman的代码,Request
属性创建为Mock
,但是,该模拟的属性未设置,因此Cookies
为空,并且您无法设置它,因为它是一个只读属性。
您有两种选择:
Cookies
中设置FakeHttpContext()
属性的模拟
方法,或如果您不想这样做,请说您直接引用该库,那么您只需从您有权访问的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并使用它。
通常,您可以使用静态方法Object
Mock
中重新创建Get(MockedThing.Object)