При использовании NUnit важно понимать этапы, которые проходит тест, когда он загружается, а затем запускается. Поскольку я не знаю, что вы делаете на каждом этапе, я начну с описания этих этапов. Я добавлю к этому ответу после того, как вы опубликуете некоторый код, который показывает, что делают ваш фабричный класс, ваш метод [SetUp]
и ваши фактические тесты.
Вкратце, NUnit загружает тесты передэто работает им. На самом деле он может запускать тесты нескольких таймов для каждой нагрузки - это зависит от типа используемого бегуна. Примеры:
NUnit-console загружает тесты один раз и запускает их один раз, затем завершает работу.
TestCentric GUI загружает тесты один раз, а затем запускает их каждыйвремя, когда вы выбираете тесты и нажимаете кнопку выполнить. Он также может перезагрузить их, используя опцию меню.
TestExplorer, используя тестовый адаптер NUnit 3, загружает тесты и затем запускает их каждый раз, когда вы нажимаете кнопку выполнить.
В идеале вы должны написать свои тесты, чтобы они работали под любым бегуном. Для этого вы должны предположить, что они будут запускаться несколько раз для каждой загрузки. Не пишите код во время загрузки, который вы хотите видеть повторяющимся для каждого запуска. Если вы будете следовать этому правилу, у вас будут более надежные тесты.
Итак ... что делает NUnit на каждом этапе? Вот оно ...
Загрузка ...
- Весь код в вашем
[TestCaseSource]
выполняется.
Запуск ...
Как вы заметили, код, для которого вы пишетелюбой шаг может зависеть только от шагов, которые уже выполнены. В частности, действие, выполняемое при загрузке теста, не может зависеть от действий, которые являются частью запуска it. Это имеет смысл, если вы считаете, что «загрузка» действительно означает создание теста, который будет выполняться.
В вашем [TestCaseSource]
вы должны вызывать только фабрику, которая создает объекты, если вы заранее знаете, какие объекты создавать. Обычно лучший подход - инициализировать те параметры, которые будут использоваться для создания объектов. Затем они используются для создания объектов в [OneTimeSetUp]
или [SetUp]
в зависимости от времени жизни объекта, к которому вы стремитесь.
Этого достаточно (возможно, слишком) для обобщения! Если вы отправите код, я добавлю более конкретные предложения к этому ответу.