Как я могу использовать тестовый пример 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 #, мы можем найти решение этой проблемы. Порядок действий следующий:
- Получить данные статическим методом
- Статический метод помещается перед всеми другими членами класса.
- Важно отметить, что исходный код завершается только один раз за выполнение (это одно из ограничений этого метода).
- Тестовый пример может использовать ранее полученные данные.