2015-07-10 2 views
9

У меня есть старый MBUnit код, который выглядит следующим образом:Может ли TestActionAttribute в NUnit запустить BeforeTest до собственного метода SetUp прибора?

public class MyFixture { 

    [SetUp] 
    public void SetUp() { 
     // Add data to database 
    } 

    [Test, Rollback] 
    public void DoTest() { 
     // Tests with the data 
    } 
} 

Мой новый атрибут NUnit Откат выглядит как это:

public class RollbackAttribute : TestActionAttribute 
{ 
    public override void BeforeTest(TestDetails testDetails) 
    { 
     // Begin transaction 
    } 

    public override void AfterTest(TestDetails testDetails) 
    { 
     // Abort transaction 
    } 
} 

Откат должен откатить новые данные, добавленные в SetUp метод, а также любые модификации во время самого теста. К сожалению, кажется, что PreTest от NUnit работает после метода SetUp прибора, поэтому данные, добавленные во время SetUp, не откат.

Есть ли способ запустить BeforeTest до SetUp?

Один из вариантов будет базовым классом и заменит существующие атрибуты Rollback дополнительным кодом в SetUp и TearDown, однако некоторые из моих тестов требуют выполнения вне транзакции (они создают несколько транзакций сами во время тестового прогона), поэтому добавление транзакции вокруг всех тестовых случаев потребуют немного внимания. Я бы предпочел найти решение, которое может повторно использовать существующие атрибуты Rollback.

ответ

4

Есть ли способ запустить BeforeTest до SetUp?

Я так не думаю, см., Например, this related discussion on google groups. Проблема, о которой идет речь, очень похожа, как вы можете видеть, код в методе SetUp будет работать даже до метода BeforeTest, используемого на уровне тестового оборудования (у вас есть его на тестовом уровне).

Обход с моей точки зрения было бы удалить SetUpAttribute из метода SetUp и вызвать метод SetUp явно в начале каждого теста, а именно:

public class MyFixture 
{ 
    public void SetUp() 
    { 
     // Add data to database 
    } 

    [Test, Rollback] 
    public void DoTest() 
    { 
     SetUp(); 

     // Tests with the data 
    } 
} 

Ваш вопрос напомнил мне вопрос что marc_s поднят в this SO thread. Вопрос не связан с вашей проблемой, но он использовал ту же конструкцию, какую я предлагаю выше, поэтому, возможно, нет , что плохая идея.

EDIT:

Here является открытым вопрос о GitHub NUnit в. Но все-таки, запрошенный порядок есть:

BeforeTest (BaseFixture)
BaseSetUp BeforeTest (Крепеж)
SetUp
BeforeTest (Test)
Тест AfterTest (Test)
Teardown AfterTest (Крепеж)
BaseTearDown AfterTest (BaseFixture)

Так что не совсем то, что вы хотите, «BeforeTest (Test)» будет выполняться d после SetUp.

+0

Да, я думаю, что первоначальная реализация, которую я рефакторинг, была немного обратной - метод SetUp для каждой привязки не должен полагаться на атрибут per-test, чтобы убедиться, что его состояние очищено правильно, поэтому оно полностью разумно изменить это. – Douglas

+0

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

+0

@Puppy ах, я вижу, спасибо, я думал, вы двое - сотрудники. –

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