2017-01-23 4 views
1

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

Проблема, с которой я столкнулся, связана с некоторыми параметризованными тестами, которые я пытаюсь создать с помощью 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 будет работать хорошо, если он находится в самом пробное тело, но тест игнорируется, если какой-либо из тестов создать его экземпляр.

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


Update:

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

ответ

2

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

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

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

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