【发布时间】:2023-04-08 14:59:01
【问题描述】:
我正在编写一些单元测试来测试控制器。在该控制器中有对服务的调用。在我的测试中,我想模拟服务调用并明确指定所需的返回。
当代码运行时,它进入控制器,当它到达服务时,我可以清楚地看到它正在使用我的模拟。但是,mock 的返回值始终为 null 而不是我指定的返回值(即expectedItem)。有什么想法吗?
针对控制器操作的单元测试
public class SearchIATeamControllerTests : IDisposable
{
private readonly SearchIATeamController _sut;
private IFixture _fixture;
public SearchIATeamControllerTests()
{
_fixture = new Fixture().Customize(new AutoMoqCustomization());
_sut = _fixture.Create<SearchIATeamController>();
}
[Fact]
public async Task Get_team_name_with_ia_team_name_returns_ok()
{
// Arrange
var expectedResultItem = _fixture.Create<SearchIATeamResponse>();
var expectedItem = new List<SearchIATeamResponse>
{
expectedResultItem
};
var mockIATeamService = _fixture.Create<Mock<IIATeamSearchService>>();
mockIATeamService.Setup(m => m.GetIATeamName(It.IsAny<string>())).ReturnsAsync(expectedItem);
// Act
var result = await _sut.Get("test").ConfigureAwait(false);
}
}
为简洁起见,名称已缩写。
被测系统
public async Task<ActionResult<SearchIATeamResponse>> Get([FromQuery] string iATeamName)
{
if (iATeamName == null)
{
return BadRequest();
}
try
{
var result = await _searchIATeamService.GetIATeamName(iATeamName);
if (!result.Any())
{
return NotFound();
}
return Ok(result);
}
catch (ArgumentException ex)
{
return BadRequest(ex.Message);
}
}
【问题讨论】:
-
这几乎总是来自您的
Setup嘲笑错误的事情。尝试将模拟设置为严格模式,看看是否能给你任何提示。 -
您能否展示正在单元测试的代码,以便我们了解如何调用 GetIATeamName 方法。
-
@IanSoc 现已添加。
-
@StriplingWarrior 严格模式没有发现任何问题。
-
是严格模式导致调用抛出异常,还是 mock 继续返回 null?
标签: c# moq autofixture