NRE в модульном тесте, когда ждут издевательский метод - PullRequest
3 голосов
/ 30 января 2020

Я пытаюсь создать модульный тест для. net Core 3 Web API с mstest.

Я также использую:

  • Autofixture
  • 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()

1 Ответ

5 голосов
/ 30 января 2020

В вашем контроллере вы предполагаете, что GetBeer возвращает ненулевое задание, потому что вы безоговорочно ожидаете его. Затем вы проверяете результат, пиво, чтобы увидеть, является ли он null или нет:

var beer = await _beerService.Getbeer(beerId);
if (beer == null) return NotFound();

В этой строке вы не возвращаете задачу с null пивом, вы возвращаете null task:

_mockBeerService.Setup(x => x.GetBeer(It.IsAny<int>())).Returns((Task<Beer>)null);

Таким образом, ожидание null вызывает ваше NullReferenceException.

Если вы хотите вернуть пиво null в качестве результата Задачи, вместо этого вам нужно будет использовать:

_mockBeerService.Setup(x => x.GetBeer(It.IsAny<int>())).Returns(Task.FromResult<Beer>(null));

Или даже:

_mockBeerService.Setup(x => x.GetBeer(It.IsAny<int>())).ReturnsAsync(null);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...