如何使用 Moq 创建带有 JSON body 的模拟 HTTP post 请求

How to create mock HTTP post request with a JSON body using Moq

为了对我的 api 控制器进行单元测试,我正在尝试按照标题所说的进行基本操作,但是我在找到正确方法时遇到了问题,并且无法在这上面花费太多时间。这是我的代码。

[TestMethod]
public void Should_return_a_valid_json_result()
{
    // Arrange
    Search search = new Search();
    search.Area = "test";
    string json = JsonConvert.SerializeObject(search);

    var context = new Mock<HttpContextBase>();
    var request = new Mock<HttpRequestBase>();

    request.Setup(r => r.HttpMethod).Returns("POST");
    request.Setup(r => r.InputStream.ToString()).Returns(json);

    context.Setup(c => c.Request).Returns(request.Object);

    var controller = new UserController();
    controller.ControllerContext = new HttpControllerContext() {  RequestContext = context };

   //more code

}

Last line returns Error CS0029 Cannot implicitly convert type 'Moq.Mock System.Web.HttpContextBase' to 'System.Web.Http.Controllers.HttpRequestContext'.

我也不确定我应该使用的 Moq 语法,其他问题、示例和 Moq 文档对我帮助不大。

如果只是为了传递一个请求,这里不需要 mock。

[TestMethod]
public void Should_return_a_valid_json_result() {
    // Arrange
    var search = new Search();
    search.Area = "test";
    var json = JsonConvert.SerializeObject(search);

    var request = new HttpRequestMessage();
    request.Method = HttpMethod.Post;
    request.Content = new StringContent(json);

    var controller = new UserController();
    controller.Request = request;

    //more code

}

我正在使用这种方法

        var json = JsonConvert.SerializeObject(request);
        var stream = new MemoryStream(Encoding.UTF8.GetBytes(json));
        var httpContext = new DefaultHttpContext()
                              {
                                Request = { Body = stream, ContentLength = stream.Length }
                              };
        var controllerContext = new ControllerContext { HttpContext = httpContext };            

        var controller = new Your_Controller(logic, logger) { ControllerContext = controllerContext };