簡體   English   中英

使用Moq設置Mock存儲庫

[英]Setting up Mock repository with Moq

我正在使用xUnit和Moq進行單元測試控制器邏輯。 我正在嘗試使用一個Mock存儲庫對象,該對象將使測試用例能夠通過。 但是,在我的設置中,這導致測試失敗,因為Mock存儲庫返回null而不是TweetDay對象。

我正在測試TweetsController:

public class TweetsController : ControllerBase
{
    private readonly ITweetDayRepository _tweetDayRepository;

    public TweetsController(ITweetDayRepository tweetDayRepository)
    {
        //Implementation here
    }

    public async Task<IActionResult> GetTweetDay()
    {
            var tweet = await _tweetDayRepository.GetTweetOfTheDayAsync(_systemClock.GetToday);

            if (tweet == null)
            {
                _logger.LogError(LoggingEvents.GetItemNotFound, "An error occurred getting tweet with date: {Date}", _systemClock.GetToday);
                return BadRequest();
            }

            return Ok(tweet);
        }
        catch (Exception ex)
        {
            _logger.LogError(LoggingEvents.GetItemNotFound, ex, "An error occurred getting tweet with date: {Date}", _systemClock.GetToday);
            return BadRequest();
        }
    }
}

下面是我的測試用例:

public class TweetsControllerTests
{
    private Mock<IMemoryCache> _cache;
    private readonly Mock<IMapper> _mapper;
    private readonly Mock<ILogger<TweetsController>> _logger;
    private readonly Mock<ISystemClockService> _systemClock;
    //private readonly ITweetDayRepository _tweetDayRepository;

    public TweetsControllerTests()
    {
        _cache = new Mock<IMemoryCache>();
        _mapper = new Mock<IMapper>();
        _systemClock = new Mock<ISystemClockService>();
        _logger = new Mock<ILogger<TweetsController>>();
    }

    [Fact]
    public async Task GetTweetDay_ReturnsOkResult_WithATweetObject()
    {
        // Arrange
        var mockRepo = new Mock<ITweetDayRepository>();
        mockRepo.Setup(repo => repo.GetTweetOfTheDayAsync(DateTime.Today))
            .ReturnsAsync(GetTestTweet());

        var controller = new TweetsController(mockRepo.Object, _cache.Object, _logger.Object,
                                                 _systemClock.Object, _mapper.Object);

        // Act
        var result = await controller.GetTweetDay();

        // Assert
        var okResult = Assert.IsType<OkResult>(result);
    }

    private TweetDay GetTestTweet()
    {
        var tweet = new TweetDay()
        {
            Bird = new Bird(),
            BirdId = 0,
            CreationDate = new DateTime(2016, 7, 2),
            DisplayDay = new DateTime(2016, 7, 2),
            LastUpdateDate = new DateTime(2016, 7, 2),
            TweetDayId = 0
        };

        return tweet;
    }
}

在我的設置下,我希望Mock存儲庫返回在以下位置初始化的TweetDay對象:

mockRepo.Setup(repo => repo.GetTweetOfTheDayAsync(DateTime.Today))
    .ReturnsAsync(GetTestTweet());

我無法找出問題的確切根源。

我是否正確設置了Mock存儲庫? 還是其他地方的問題?

根據顯示的設置,您之一注入了模擬依賴項(我懷疑系統時鍾)

 var tweet = await _tweetDayRepository.GetTweetOfTheDayAsync(_systemClock.GetToday);

行為不符合預期,並導致硬編碼的DateTime.Today期望不匹配,因此返回null或與匹配器中使用的默認值不同的默認值。

您可以通過放松目標模擬中的預期匹配來解決此問題

mockRepo
.Setup(repo => repo.GetTweetOfTheDayAsync(It.IsAny<DateTime>()))
.ReturnsAsync(GetTestTweet());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM