Как я могу использовать тестовый пример NUnit, который зависит от запуска метода TestSetup?

Я использую NUnit 2 для написания некоторых модульных тестов для C#. Моя среда Visual Studio 2015 Professional с установленным Resharper.

У меня проблема с некоторыми параметризованными тестами, которые я пытаюсь создать, используя TestCaseSourceAttribute, В простых случаях я могу создать такие тесты, которые будут хорошо работать:

[Test, TestCaseSource(nameof(MyTestCases))]
public void MyTest(string name) {
    Assert.IsFalse(String.IsNullOrEmpty(name));
}

private static IEnumerable<TestCaseData> MyTestCases {
    get {
        yield return new TestCaseData("test");
        yield return new TestCaseData("123");
    }
}

Однако, когда я пытаюсь создать экземпляры типов, которые должны быть сопоставлены с объектами базы данных или которые проверяют базу данных в процессе их инициализации, тест игнорируется исполнителем теста. Например:

[Test, TestCaseSource(nameof(MyTestCases))]
public void MyTest(MyMappedType instance) {
    Assert.IsTrue(instance.SomeProperty);
}

private static IEnumerable<TestCaseData> MyTestCases {
    get {
        yield return new TestCaseData(GetAnInstanceOfMyMappedType());
        yield return new TestCaseData(GetADifferentInstanceOfMyMappedType());
    }
}

Создание экземпляров MyMappedType будет работать нормально, если он находится в самом теле теста, но тест игнорируется, если какой-либо из тестовых примеров его создает.

Могу ли я заставить эти тесты работать параметризованным способом? Есть ли в документации ссылки на это?


Обновить:

Кажется, проблема связана с тем, что некоторый код в свойстве тестового примера зависит от класса. TestSetup метод уже запущен. Есть ли способ запустить установку перед инициализацией каждого теста, а не после?

2 ответа

Решение

Нет, ваша установка не может быть вызвана до того, как будут сгенерированы ваши тесты.

Кроме того, хотя создание экземпляров объектов в вашем методе TestCaseSource возможно, эти объекты выйдут из области действия, как только метод вернется, если не будут сохранены где-либо, как в статическом члене. И, конечно, это было бы не очень хорошей практикой.

Перепишите ваш TestCaseSource для предоставления параметров, таких как целые и строки, которые можно использовать для создания объектов, которые вам нужны во время выполнения.

Если вы хотите создавать эти объекты только один раз для каждого прибора, используйте OneTimeSetUp вместо SetUp и используйте параметризованный прибор для сохранения параметров, необходимых для их создания.

Используя свойство компилятора C #, мы можем найти решение этой проблемы. Порядок действий следующий:

  1. Получить данные статическим методом
  2. Статический метод помещается перед всеми другими членами класса.
  3. Важно отметить, что исходный код завершается только один раз за выполнение (это одно из ограничений этого метода).
  4. Тестовый пример может использовать ранее полученные данные.
Другие вопросы по тегам