Saya mencoba membuat tes tiruan sederhana di .Net 5.0 dan NUnit. Ini berfungsi untuk semuanya, tetapi tidak untuk metode tertentu ... dan saya tidak dapat menemukan solusinya.

Pertama saya memiliki kelas logika:

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

Dan di Kelas Tes Saya, Saya Memiliki

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

}

Jadi masalah saya adalah bahwa di dalam CreateGame_ShouldReturnNewGameWithLastDrawedCard() saya membuat tiruan yang seharusnya mengembalikan objek Game ke newGame. Tapi SELALU mengembalikan nol. Saat debuggin, baris di CreateGame() mengembalikan null

return await _gameRepository.Insert(newGame);

Untuk metode lain, seperti

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

var gameResult = await _gameBusiness.GetGame(5);

Ini bekerja sempurna. Apa yang saya lewatkan di sini?

1
Adley 12 Mei 2021, 04:04

1 menjawab

Jawaban Terbaik

Masalahnya adalah argumennya tidak cocok dengan apa yang telah diatur sehingga akan mengembalikan null secara default.

Refactor untuk menggunakan pencocokan argumen dan juga untuk menangkap model yang dibuat di dalam anggota yang sedang diuji

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

Referensi Moq Quickstart

0
Nkosi 12 Mei 2021, 02:00