如何在 Asp.NetCore 控制器中模拟 HttpResponse?

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)

它表明Responsenull

我检查了元数据,它显示这Response是抽象基类中的只读ControllerBase属性,如下所示:

public HttpResponse Response { get; }
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法嘲笑这个Response财产呢?

Nko*_*osi 7

请求和响应与控制器的 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上面示例中使用的,默认情况下将有一个非空的空请求和响应。这应该使您能够访问响应以根据需要练习单元测试。