C# 等待模拟方法时单元测试中的NRE

C# 等待模拟方法时单元测试中的NRE,c#,unit-testing,.net-core,moq,autofixture,C#,Unit Testing,.net Core,Moq,Autofixture,我正在尝试使用mstest为.NETCore3WebAPI构建一个单元测试 我还使用: 自动夹具 最小起订量 自动夹具 当未找到啤酒时,此单元测试应返回NotFound()响应 private IFixture _fixture; private BeerController _beerController; private Mock<IBeerService> _mockBeerService; [TestInitialize] pub

我正在尝试使用mstest为.NETCore3WebAPI构建一个单元测试

我还使用:

  • 自动夹具
  • 最小起订量
  • 自动夹具
当未找到啤酒时,此单元测试应返回
NotFound()
响应

    private IFixture _fixture;
    private BeerController _beerController;
    private Mock<IBeerService> _mockBeerService;

    [TestInitialize]
    public void Initialize()
    {
        _fixture = new Fixture().Customize(new AutoMoqCustomization());
        _mockBeerService = _fixture.Freeze<Mock<IBeerService>>();
        _beerController = _fixture.Create<BeerController>();
    }

    [TestMethod]
    public async Task WhenCallGetBeerWithoutMatchReturnNotFound404()
    {
        //Arrange
        int beerId = _fixture.Create<int>();
        _mockBeerService.Setup(x => x.GetBeer(It.IsAny<int>())).Returns((Task<Beer>)null);

        //Act
        var actionResult = await _beerController.Get(beerId);

        //Assert
        Assert.IsInstanceOfType(actionResult.Result, typeof(NotFoundResult));
    }
它工作得很好


所以我猜他不喜欢
中的
.Returns((Task)null)
当您的控制器中没有匹配returnnotfound404()
的callgetbeer时,您假设
GetBeer
返回一个非null任务,因为您无条件地等待它。然后检查结果,即啤酒,看它是否为
null

var-beer=wait _-beerService.Getbeer(beerId);
if(beer==null)返回NotFound();
在这一行中,您返回的任务不是
null
beer,而是
null
任务:

\u mockBeerService.Setup(x=>x.GetBeer(It.IsAny())。返回((Task)null);
因此,等待
null
会导致
NullReferenceException

如果要将
null
beer作为任务的结果返回,则需要使用:

\u mockBeerService.Setup(x=>x.GetBeer(It.IsAny())。返回(Task.FromResult(null));
甚至:

\u mockBeerService.Setup(x=>x.GetBeer(It.IsAny()).ReturnsAsync(null);

谢谢!这就是问题所在。我只需要在第二个解决方案中为
Beer
添加一个强制转换:
.ReturnsAsync((Beer)null)
    [HttpGet("{beerId:int}")]
    public async Task<ActionResult<beer>> Get(int beerId)
    {
        try
        {
            var beer = await _beerService.Getbeer(beerId);
            if (beer == null) return NotFound();

            return Ok(beer);
        }
        catch (Exception)
        {
            return BadRequest();
        }
    }
    [TestMethod]
    public async Task WhenCallGetBeerWithMatchReturnOk200()
    {
        //Arrange
        int beerId = _fixture.Create<int>();
        var beer = _fixture.Create<Task<Beer>>();

        _mockBeerService.Setup(x => x.GetBeer(It.IsAny<int>())).Returns(beer);
        //Act
        var actionResult = await _beerController.Get(beerId);

        //Assert
        Assert.IsInstanceOfType(actionResult.Result, typeof(OkObjectResult));
    }