【发布时间】: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 异常