首页 > 解决方案 > 如何使用 Moq 模拟此代码以进行单元测试?

问题描述

我正在尝试为以下方法编写单元测试,但this在参数this.Request.Bodythis.Request.Headers. mock 的解决方案是_azureDevopsTask.PublishToHandler(this.Request.Body, this.Request.Headers)什么?

我目前正在使用 Moq 框架编写单元测试。_azureDevopsTask这里使用依赖注入的不同类的对象在哪里。

[HttpPost]
public IActionResult Execute()
{
    try
    {
        _azureDevopsTask.PublishToHandler(this.Request.Body, this.Request.Headers);
        return CreateSuccessResponse(true);
    }
    catch (Exception ex)
    {
        return CreateErrorResponse(ex.Message);
    }
}

标签: c#unit-testing

解决方案


实际上,您不需要 Moq 来模拟请求,您可以使用DefaultHttpContext

var httpContext = new DefaultHttpContext();

设置身体:

var stream = new MemoryStream(Encoding.UTF8.GetBytes("{example: value}"));
httpContext.Request.Body = stream;
httpContext.Request.ContentLength = stream.Length;

设置标题:

httpContext.Request.Headers["Content-Type"] = "application/json";

在 Controller 中设置 mock HttpContext:

var controller = new ExampleController()
{
    ControllerContext = new ControllerContext()
    {
        HttpContext = httpContext,
    }
};

推荐阅读