[英]Moq.Mock<T> setting up expressions into a Mock using MOQ results in mock setups not being matched
[英]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.