2017-02-22 38 views
0

У меня есть следующая базовая настройка для уни-теста: он тестирует класс, который отвечает за индексирование файлов в каталоге и продолжает давать правильный по требованию. Для этого я использую файловую систему mock, предоставленную библиотекой system.io.abstractions. Базовая настройка заключается в следующем:NUnit, может ли «настроить» работать до «ValueSource»?

[TestFixture] 
public class ImageDataTests 
{ 
    private static MockFileSystem fs; 
    private const int TESTNUM = 3; 
    [SetUp] 
    public static void Init() { 
     var allnamegroups = TestSettings.NameGroupFactory(TESTNUM); 
     fs = new MockFileSystem(); 
     foreach (string[] namegroup in allnamegroups) { 
      var dname = ImageData.MakeDirectoryName(namegroup[0], namegroup[1]); 
      TestSettings.AddTestFilesToMockFileSystem(fs, dname); 
     } 
    } 
} 

Теперь каждый тест работает на случай для этого, а также для проверки (например) функцию «перезагрузить» Я добавить следующий метод выше класса:

public static IEnumerable<ImageData> ImgDatSource() { 
     while (true) { 
      yield return new ImageData("test", fs); 
     } 
    } 
    [Test, Sequential] 
    public void GetAllOfTypeTest(
     [ValueSource(nameof(ImgDatSource))] ImageData img, 
     [Values("foo", "bar", "this")]string type, 
     [Values(1, 2, 0)]int ex) { 
     Assert.That(() => img.GetAllOfType(type).Count(), Is.EqualTo(ex)); 
    } 

Это должно (прямо сейчас) перечислить все файлы, начиная с соответственно «foo», «bar» и «this». - Не удалось, указав, что каталог не найден. - Еще до запуска первого теста: при инициализации Imagedata. Отладка проверяет, что я думал: Init() еще не запущен, когда ValueSource пытается инициализировать ввод.

Есть ли способ сделать «такой» тест, за исключением инициализации Imagedata внутри испытательного тела? (И потерять параметрическую конструкцию + тест-индексацию, либо написать много подобных тестов вручную).

Обратите внимание, что мне действительно нужно запускать генератор файловой системы каждый тест: в то время как тест выше прост и не делает многого. Некоторые тесты будут адаптировать/изменить файловую систему, чтобы протестировать класс против большего количества ребер. - Также во время теста.

ответ

0

Выполнение NUnit состоит из двух этапов: нагрузок (обнаружения) испытаний и текущих испытаний. OneTimeSetUp, SetUp, выполнение тестового метода, TearDown и OneTimeTearDown - все это часть запуска теста.

Испытание загрузки происходит, как и следовало ожидать, перед запуском тестов. Источники данных (TestCaseSource или ValueSource) запускаются во время фазы загрузки.

Это приводит к двум выводам: 1. Невозможно, чтобы что-либо из ваших методов SetUp и других методов тестирования влияло на данные, используемые для теста. 2. Источники данных должны предоставлять параметры данных, которые позволят вам создавать объекты во время выполнения, а не сами объекты.

В вашем примере я бы изменил метод тестирования на четыре параметра, заменив img на «test» и fs. Я бы добавил строку к началу каждого теста, чтобы создать imagedata, вызвав вспомогательный метод, смоделированный после вашего Init.

+0

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

+0

Я в частичном согласии. Копирование дубликатов в тестах часто полезно, потому что оно делает каждую тестовую стенд само по себе. В этом случае, однако, было бы лучше, если бы был способ избежать этого. Единственный подход, который я могу придумать, - это параметризовать прибор и создать imagedata в OneTImeSetUp. Однако это может быть больше, чем просто добавление кода в каждый метод. – Charlie

 Смежные вопросы

  • Нет связанных вопросов^_^