Для всех, у кого есть эта проблема, комментарий Алексея является правильным. Вам нужно скачать фреймворк (например, Moq) и использовать его для макетирования зависимостей, ожидаемых вашим кодом. Например, ниже приведен один из моих фиксированных модульных тестов:
public void IndexDataModel_ShouldDisplayMedia()
{
var mockLogger = new Mock<ILogger<IndexModel>>();
var mockDataAccess = new Mock<IMediaDataAccess>();
mockDataAccess.Setup(media => media.GetAllMedia()).ReturnsAsync(GetTestMedia());
IndexModel indexController = new IndexModel(mockDataAccess.Object, mockLogger.Object);
var result = indexController.OnGet();
var viewResult = Assert.IsType<PageResult>(result);
var model = Assert.IsAssignableFrom<IEnumerable<Media>>(
indexController.mediaList);
}
Хитрость в том, что вам нужно смоделировать все, что вы обычно зависите от внедрения в ваш конструктор, в моем случае это было:
var mockLogger = new Mock<ILogger<IndexModel>>();
var mockDataAccess = new Mock<IMediaDataAccess>();
Мой конструктор использует и ILogger, и IMediaDataAccess, поэтому мне нужно было их посмеяться. Кроме того, есть другой код, который предоставляет фиктивные возвращаемые значения, когда ваши проверенные зависимости используются тестом. Это делается с помощью строки кода .Setup. Все это делает (я думаю), когда вызывается GetAllMedia (), фиктивный объект возвращает содержимое GetTestMedia () вместо необходимости совершать реальные вызовы. Просто убедитесь, что любая функция, которую вы пишете, имеет тот же тип возврата, что и реальная функция. Для справки, это моя функция GetTestMedia ():
private List<Media> GetTestMedia()
{
var listMedia = new List<Media>();
Media testMedia = new Media
{
Description = "TestDesc",
Genre = "TestGenre",
Name = "TestName",
Rating = MediaRating.Excellent,
Type = MediaType.Movie,
Id = 1
};
listMedia.Add(testMedia);
Media testMedia2 = new Media
{
Description = "TestDesc2",
Genre = "TestGenre2",
Name = "TestName2",
Rating = MediaRating.Poor,
Type = MediaType.Music,
Id = 2
};
listMedia.Add(testMedia2);
return listMedia;
}