【发布时间】:2017-06-03 23:27:21
【问题描述】:
我需要在单元测试中获取下面提到的 cookie 中的值。
string[] myCookies = Request.Cookies.AllKeys;
值应为ASP.NET_SessionId、__RequestVerificationToken。
是否可以为它创建一个模拟。
【问题讨论】:
标签: c# unit-testing cookies mocking session-cookies
我需要在单元测试中获取下面提到的 cookie 中的值。
string[] myCookies = Request.Cookies.AllKeys;
值应为ASP.NET_SessionId、__RequestVerificationToken。
是否可以为它创建一个模拟。
【问题讨论】:
标签: c# unit-testing cookies mocking session-cookies
您可以创建一个封装所需信息的假 HttpContext
private class MockHttpContext : HttpContextBase {
private readonly MockRequest request;
public MockHttpContext(HttpCookieCollection cookies) {
this.request = new MockRequest(cookies);
}
public override HttpRequestBase Request {
get {
return request;
}
}
public class MockRequest : HttpRequestBase {
private readonly HttpCookieCollection cookies;
public MockRequest(HttpCookieCollection cookies) {
this.cookies = cookies;
}
public override HttpCookieCollection Cookies {
get {
return cookies;
}
}
}
}
并像这样使用
//Arrange
var cookies = new HttpCookieCollection();
cookies.Add(new HttpCookie("ASP.NET_SessionId"));
cookies.Add(new HttpCookie("__RequestVerificationToken"));
var context = new MockHttpContext(cookies);
var Request = context.Request;//This is just for demonstrative purposes
string[] myCookies = Request.Cookies.AllKeys;
或者您可以使用模拟框架来做同样的事情。
此示例使用最小起订量
var cookies = new HttpCookieCollection();
cookies.Add(new HttpCookie("ASP.NET_SessionId"));
cookies.Add(new HttpCookie("__RequestVerificationToken"));
var mockHttpContext = new Mock<HttpContextBase>();
mockHttpContext.Setup(m => m.Request.Cookies).Returns(cookies);
这个例子使用了 NSubstitute
var cookies = new HttpCookieCollection();
cookies.Add(new HttpCookie("ASP.NET_SessionId"));
cookies.Add(new HttpCookie("__RequestVerificationToken"));
var mockHttpContext = Substitute.For<HttpContextBase>();
mockHttpContext.Request.Cookies.Returns(cookies);
【讨论】: