Ошибка при попытке запустить мои тесты XUnit - PullRequest
0 голосов
/ 09 июля 2019

Я написал несколько тестов в XUnit для проверки уровня доступа к данным. Я создал экземпляры своих DAL-объектов и конфигураций так же, как если бы я использовал их в реальном веб-приложении (это настроено для запуска в среде dev для тестирования), однако XUnit выдает ошибку:

Сообщение. Следующие параметры конструктора не имеют соответствующих данных о приборах: конфигурация IConfiguration, носитель IMediaDataAccess

Я немного новичок в XUnit, поэтому не знаю, в чем проблема. Обычно ASP.NET вводит экземпляры IConfiguration и IMediaDataAccess для меня, но здесь это не так.

Мой тестовый класс и пример теста:

    public class DataAccessLayerTests
    {
        public IConfiguration Config { get; set; }
        private IMediaDataAccess mediaData;

        public IMediaDataAccess MediaData { get => mediaData; set => mediaData = value; }

        public DataAccessLayerTests(IConfiguration config, IMediaDataAccess media)
        {
            this.MediaData = media;
            this.Config = config;
        }

        public void GetAllMediaAsync_MediaListIsReturned()
        {


            List<Media> testData = mediaData.GetAllMedia().Result;


            Assert.IsType<List<Media>>(testData);

        }

}

Все тесты не пройдены из-за следующей ошибки: Сообщение: Следующие параметры конструктора не имеют совпадающих данных фикстуры: Конфигурация IConfiguration, носитель IMediaDataAccess

1 Ответ

0 голосов
/ 09 июля 2019

Для всех, у кого есть эта проблема, комментарий Алексея является правильным. Вам нужно скачать фреймворк (например, 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;
    }
...