【问题标题】:Unit Test derived Controller class using protected mediator in base controller in .NET Core 3.1在 .NET Core 3.1 的基本控制器中使用受保护的调解器进行单元测试派生控制器类
【发布时间】:2020-09-25 18:25:03
【问题描述】:

我在模拟基类控制器中定义为受保护属性的中介时遇到问题。

我想测试使用基类属性的派生类控制器的方法。

查找代码详细信息以供参考:

[ApiController]
public class BaseController : ControllerBase
{
    private IMediator _mediator;
    private IUrlHelper _urlHelper;

    protected virtual IMediator Mediator => _mediator ?? (_mediator = HttpContext.RequestServices.GetService<IMediator>());
    public BaseController()
    {

    }
}

[Route("api/[controller]")]
[ApiController]

public class ArchiveFileController : BaseController
{
    public ArchiveFileController()
    {
    }
    [HttpPost]
    public async Task<ActionResult> Post([FromBody]UploadArchiveCommand model)
    {
        try
        {
            var response = await Mediator.Send(new UploadArchiveCommand(model));
            return CreatedAtAction("Get", new { id = response.Id }, response);
        }
        catch (Exception ex)
        {
            return BadRequest(ex.Message);
        }
    }

 }

单元测试:

     [Fact]
    public async Task PostArchiveFileTest_Returns_CreatedArchiveFileInformation()
    {
        // Arrange
        var mockUploadArchiveCommand = fixture.Create<UploadArchiveCommand>();

        //Action
        _mediatorMock.Setup(x => x.Send(It.IsAny<UploadArchiveCommand>(), new CancellationToken())).
         ReturnsAsync(new UploadArchiveViewModel { Identifier = mockUploadArchiveCommand.Identifier, FileName = mockUploadArchiveCommand.FileName });

        var _archiveFileController = new ArchiveFileController();

        var result = await _archiveFileController.Post(mockUploadArchiveCommand);

        var archiveFileInfo = ((CreatedAtActionResult)result).Value as UploadArchiveViewModel;

        // Assert
        Assert.Equal(archiveFileInfo.Identifier, mockUploadArchiveCommand.Identifier);
    }

这里 Mediator 以 Null 的形式出现。

【问题讨论】:

  • 你配置HttpContext了吗?为什么不将调解器作为参数传递给基类构造函数?
  • 这种方式不能实现吗?
  • @ChandanSingh 嗨,你是把它改成构造函数注入还是找到其他方法
  • 我使用了构造函数注入。
  • 你是如何解决这个问题的,我有一个类似的设置,但是中介对象是通过构造函数注入的,并且仍然得到中介对象的 NullReference 异常

标签: .net-core xunit


【解决方案1】:

几件事:

  • 不要仅为常见的依赖项创建基类。此处的基类不会增加任何价值。
  • 对依赖项使用依赖注入,而不是服务位置。

删除基类,并通过其构造函数将依赖项注入控制器类。然后你就可以在你的单元测试中模拟这些依赖了。

【讨论】:

  • 有没有办法用相同的基类实现进行测试
猜你喜欢
  • 2020-09-23
  • 2020-10-25
  • 2012-04-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多