【问题标题】:How can I mock this code for unit testing using Moq?如何使用 Moq 模拟此代码以进行单元测试?
【发布时间】:2021-09-02 06:33:11
【问题描述】:

我正在尝试为以下方法编写单元测试,但在参数this.Request.Bodythis.Request.Headers 的情况下,this 对象设置为空引用时出现错误。模拟_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);
    }
}

【问题讨论】:

  • 你在this.Request.Body 收到NullReferenceException 吗?你想单元测试什么? _azureDevopsTask 的类型是什么?
  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: c# unit-testing


【解决方案1】:

实际上,你不需要 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,
    }
};

【讨论】:

  • 很抱歉,它不起作用。我也面临同样的问题。
  • 这就是模拟请求的方法并且它正在工作(我仔细检查了)。究竟什么是空?如果您有一个不是请求的异常,而是 _azureDevopsTask 的异常,那么您应该模拟 _azureDevopsTask 并简单地验证调用。
猜你喜欢
  • 2023-03-29
  • 2013-07-08
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 2010-12-30
  • 2014-02-14
  • 2015-07-01
  • 2021-10-20
相关资源
最近更新 更多