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

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

我正在尝试使用mstest为.net Core 3 Web API建立单元测试。

我也在使用:

  • 自动修复
  • Moq
  • AutoFixture.AutoMoq

当未找到啤酒时,此单元测试应返回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));
    }

这是我要测试的功能:

    [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();
        }
    }

但是我在此代码行Object reference not set to an instance of an object.上遇到了var beer = await _biereService.Getbeer(beerId);异常:>

这是堆栈跟踪:at BeerProject.Controllers.BeerController.<Get>d__2.MoveNext() in F:\DevProjects\Repos\API_BeerProject\BeerProject\Controllers\BeerController.cs:line 29

我通过此测试测试了return Ok(beer)

    [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));
    }  

并且运行正常。

所以我猜他不喜欢.Returns((Task<Beer>)null)中的WhenCallGetBeerWithoutMatchReturnNotFound404()

我正在尝试使用mstest为.net Core 3 Web API构建单元测试。我还在使用:Autofixture Moq AutoFixture.AutoMoq当未找到啤酒时,此单元测试应返回NotFound()响应。 ...

c# unit-testing .net-core moq autofixture
1个回答
5
投票

在您的控制器中,您假设GetBeer返回一个非空任务,因为您无条件地等待它。然后,您检查结果(啤酒)以查看是否为null

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