我想测试使用基类属性的派生类控制器的方法,请看代码细节,供参考。
[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。
有几个问题。
去掉基类,通过控制器类的构造函数将依赖注入到它的类中即可。然后你就可以在你的单元测试中模拟这些依赖关系了。