Является ли чтение файла CSV по физическому пути допустимым сценарием в модульном тесте? Зачем? - PullRequest
0 голосов
/ 05 сентября 2018
string _inboundFilePath = AppDomain.CurrentDomain.BaseDirectory + @"\Inbound\CompareDataFile.csv";

var mockReaderStream = new Mock<IReaderStream>();
mockReaderStream.Setup(x => x.CreateStream())
    .Returns(new System.IO.StreamReader(_inboundFilePath));

Здесь я зависим от входящего файла, который читает данные и выполняет другие проверки функций. мой вопрос как этого избежать? В этом случае я проверяю данные для определенного идентификатора, который приходит из CSV.

Ответы [ 2 ]

0 голосов
/ 05 сентября 2018

В дополнение к ответу от Стефана. Я предложу вам:

  1. Поместите @ "\ Inbound \ CompareDataFile.csv" в файл конфигурации.

  2. Создание открытого свойства или отдельного метода в вышеупомянутом классе, который сможет извлекать и возвращать абсолютный путь к входящему файлу (назовите его GetPath ).

  3. Создать метод UnitTest, у которого есть доступ к файлу конфигурации. Этот TestMethod должен читать конфигурационные файлы, вызывать AppDomain.CurrentDomain.BaseDirectory . Таким образом, этот метод может также получить путь абсолютного пути входящего файла и после этого вызова GetPath ()

  4. Создать абстракцию (интерфейс или абстрактный класс над Mock - (кстати, в предоставленном вами коде это не пародия, так что трудно догадаться, почему вы так его называете)).

  5. Создайте открытый метод в вышеупомянутом классе, для которого потребуется объект абстракции, и вызовите его метод ReadFromCsv () .

  6. Создать тестовый класс (макет), который будет реализовывать эту абстракцию и будет возвращать желаемые / нежелательные значения при вызове его метода ReadFromCsv () .

  7. Наконец, проверьте свой класс.

PS. Это не строгий алгоритм тестирования класса, его можно использовать. То, что вы хотели бы получить от всех этих семи пунктов, это понятие подобия юнит-теста.

Также вы не освобождаете свой класс от конфигурационного файла, поэтому используйте этот подход, чтобы освободить ваш класс от конфигурации: Как смоделировать ConfigurationManager.AppSettings с помощью moq

0 голосов
/ 05 сентября 2018

Это вряд ли будет хорошей практикой, потому что юнит-тест должен быть детерминированным. Это означает, что в любой ситуации вы должны быть уверены, что если этот тест запустится, он будет работать точно так же, как и раньше.

Если вы прочитаете CSV-файл, тест будет зависеть от внешнего мира. И, к сожалению, внешний мир не стабилен. Для начала кто-нибудь может изменить файл csv.

Вот почему лучше получать поток файлов csv из встроенного ресурса в сборку, а не из файла на жестком диске.

...