在.NET CORE3.1中,使用基类控制器中的受保护mediator对派生控制器类进行单元测试。

问题描述 投票:0回答:1

我想测试使用基类属性的派生类控制器的方法,请看代码细节,供参考。

[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。

.net core xunit
1个回答
0
投票

有几个问题。

  • 不要为了普通的依赖关系而创建一个基类。这里的基类不会增加任何价值。
  • 对依赖关系使用依赖注入,而不是服务位置。

去掉基类,通过控制器类的构造函数将依赖注入到它的类中即可。然后你就可以在你的单元测试中模拟这些依赖关系了。

© www.soinside.com 2019 - 2024. All rights reserved.