Rha*_*eng 4 c# unit-testing mocking asp.net-core
我正在开发一个 Asp.NetCore 应用程序,其中一个控制器如下所示:
[HttpPost, Route("setCookies")]
public int SetCookies([FromBody] Dictionary<string, string> cookies)
{
foreach (var cookie in cookies)
{
Response.Cookies.Append(cookie.Key, cookie.Value, new CookieOptions() { Path = "/", HttpOnly = true });
}
return 1;
}
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试为此控制器添加单元测试用例。
在我创建控制器的实例之后
var _controller = new Controller();
Run Code Online (Sandbox Code Playgroud)
并调用该方法
_controller.SetCookies(<some parameter>);
Run Code Online (Sandbox Code Playgroud)
它表明Response是null。
我检查了元数据,它显示这Response是抽象基类中的只读ControllerBase属性,如下所示:
public HttpResponse Response { get; }
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法嘲笑这个Response财产呢?
请求和响应与控制器的 current 相关联HttpContext,您需要ControllerContext在设置控制器时通过 来设置。
//...
//Arrange
HttpContext httpContext = new DefaultHttpContext();
//Controller needs a controller context
var controllerContext = new ControllerContext() {
HttpContext = httpContext,
};
//assign context to controller
var _controller = new MyController(){
ControllerContext = controllerContext,
};
//Act
int actual = _controller.SetCookies(<some parameter>);
//...
Run Code Online (Sandbox Code Playgroud)
DefaultHttpContext上面示例中使用的,默认情况下将有一个非空的空请求和响应。这应该使您能够访问响应以根据需要练习单元测试。