2016-01-26 6 views
1

Есть ли эквивалент правила JUnit на C#? Я имею в виду способ избежать повторения одних и тех же строк [SetUp] и [TearDown] в нескольких различных тестах. Вместо того, чтобы:NUnit эквивалент правила JUnit

[SetUp] 
public void SetUp() 
{ 
    myServer.connect(); 
} 

[TearDown] 
public void TearDown() 
{ 
    myServer.disconnect(); 
} 

... поставил логику в правиле, которое может быть объявлен как поле в нескольких тестах:

public MyRule extends ExternalResource { 
    @Override 
    protected void before() throws Throwable 
    { 
    myServer.connect(); 
    }; 

    @Override 
    protected void after() 
    { 
    myServer.disconnect(); 
    }; 
}; 

, а затем

class TestClass 
{ 
    @Rule MyRule = new MyRule(); 
    ... 
} 
+2

C# не является основой модульного тестирования, как JUnit не является языком. Может быть эквивалент аннотации JUnit '@ Rule' в любой используемой тестовой структуре (или другом способе достижения того же результата), но это сложно сказать, потому что мы знаем только * язык *, который вы используете. –

+0

@Jon Skeet: Я использую NUnit, я обновил вопрос. –

ответ

1

NUnit хорошо работает с тестами наследование, поэтому вы можете создать базовый тестовый класс с использованием методов SetUp и TearDown:

[TestFixture] 
public class BaseTest 
{ 
    [SetUp] 
    public virtual void SetUpTest() 
    { 
     //... 
    } 

    [TearDown] 
    public virtual void TearDownTest() 
    { 
     //... 
    } 
} 

Затем создайте обычный тестовый класс, который наследуется от базового класса, и он будет использовать повторно SetUp и TearDown реализации:

[TestFixture] 
public class RegularTest : BaseTest 
{ 
    [Test] 
    public virtual void MyTest() 
    { 
     //... 
    } 
} 
+1

Именно этого я и хотел бы избежать. Такое наследование тестов, как правило, заканчивается неудачно со временем. –

+0

@PhilippeBlayo Извините, но в вашем вопросе говорится, что вы хотите «избегать повторения одних и тех же строк [SetUp] и' [TearDown] 'в нескольких разных тестах», что в точности соответствует этому адресу. –

2

Вы могли бы реализовать свой собственный TestActionAttribute класс, который запускает свой предпродажный и после-тестирования кода , Если вы собираетесь выполнять одно и то же действие до и после каждого теста, вы можете определить свой пользовательский атрибут в объявлении класса.

.: например

[MyRule] // your custom attribute - applied to all tests 
public class ClassTest 
{ 
    [Test] 
    public void MyTest() 
    { 
     // ... 
    } 
} 

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
public class MyRuleAttribute : TestActionAttribute 
{ 
    public override void BeforeTest(TestDetails testDetails) 
    { 
     // connect 
    } 

    public override void AfterTest(TestDetails testDetails) 
    { 
     // disconnect 
    } 
}