【问题标题】:Mock test returning null in NUnit .Net 5.0模拟测试在 NUnit .Net 5.0 中返回 null
【发布时间】:2021-08-02 08:55:18
【问题描述】:

我正在尝试在 .Net 5.0 和 NUnit 中进行简单的模拟测试。它适用于一切,但不适用于特定方法......我找不到解决方案。

首先我有一个逻辑类:

public class GameBusiness : IGameBusiness
{
    private readonly IGameRepository _gameRepository;
    public GameBusiness(IGameRepository gameRepository)
    {
        _gameRepository = gameRepository;

    }
    public async Task<Game> CreateGame()
    {
        var drawCard = GenerateRandomCardValue();
        var newGame = new Game() { LastDrawedCard = drawCard };
        return await _gameRepository.Insert(newGame);
    }

    public async Task<Game> GetGame(int gameId)
    {
        return await _gameRepository.GetById(gameId);
    }

   
    private int GenerateRandomCardValue()
    {
        var random = new Random();
        return random.Next(1, 13);
    }
   
}

在我的测试课中,我有

private readonly Mock<IGameRepository> _gameRepository = new Mock<IGameRepository>();

    private readonly GameBusiness _gameBusiness;

    public GameRepositoryTest()
    {
        _gameBusiness = new GameBusiness(_gameRepository.Object);
    }

    [SetUp]
    public void Setup()
    {
    }

    [Test]
    public async Task GetGame_ShouldReturnGame_WhenGameExists()
    {
        var gameId = 5;
        var game = new Game()
        {
            Id = 5,
            LastDrawedCard = 3
        };

        _gameRepository.Setup(x => x.GetById(gameId)).ReturnsAsync(game);

        var gameResult = await _gameBusiness.GetGame(5);

        Assert.AreEqual(gameId, gameResult.Id);
    }

    [Test]
    public async Task CreateGame_ShouldReturnNewGameWithLastDrawedCard()
    {
        var newGame = new Game()
        {
            Id = 5,
            LastDrawedCard = 3
        };

        _gameRepository.Setup(x => x.Insert(new Game())).ReturnsAsync(newGame);

        var newGameResult = await _gameBusiness.CreateGame();

        Assert.IsTrue(newGame.LastDrawedCard > 0);
    }

}

所以我的问题是在 CreateGame_ShouldReturnNewGameWithLastDrawedCard() 内部我创建了一个模拟,它应该返回给我一个与 newGame 关联的 Game 对象。但它总是返回 null。 调试时,CreateGame()中的行返回null

return await _gameRepository.Insert(newGame);

对于其他方法,例如

_gameRepository.Setup(x => x.GetById(gameId)).ReturnsAsync(game);

var gameResult = await _gameBusiness.GetGame(5);

完美运行。我在这里缺少什么?

【问题讨论】:

    标签: c# .net unit-testing .net-core nunit


    【解决方案1】:

    问题是参数与设置的不匹配,因此默认情况下会返回 null。

    重构以使用参数匹配器并捕获在被测成员中创建的模型

    [Test]
    public async Task CreateGame_ShouldReturnNewGameWithLastDrawedCard() {
        //Arrange
        _gameRepository
            .Setup(x => x.Insert(It.IsAny<Game>())) //<-- uses a catch-all matcher
            .ReturnsAsync((Game arg) => arg); //<-- captures passed argument and returns it
    
        //Act
        var actual = await _gameBusiness.CreateGame();
    
        //Assert
        Assert.IsTrue(actual != null);
        Assert.IsTrue(actual.LastDrawedCard > 0);
    }
    

    参考Moq Quickstart

    【讨论】:

    • 这个答案实际上在很多方面帮助了我。谢谢!!
    猜你喜欢
    • 2020-12-16
    • 2021-12-03
    • 2018-09-12
    • 2020-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    相关资源
    最近更新 更多