2009-09-18 4 views
2

У меня есть класс, который имеет некоторые модульные тесты, но когда я запускаю тесты, я хотел бы, чтобы класс был создан с помощью другого конструктора. Что-то вроде этого:NUnit выполняет с альтернативным конструктором

[TestFixture] 
public class MyClass 
{ 
    public MyClass() { /* set up for production */ } 

    [TestFixtureConstructor] 
    public MyClass() { /* set up for testing */ } 

    [Test] 
    public void FirstTest() 
    { 
     // assert some values 
    } 
} 

Возможно ли это?

Я рассмотрел использование статического заводского метода для создания класса в производстве (с помощью частного конструктора) и публичного конструктора для платформы тестирования.

Есть ли у кого-нибудь другие решения?

ответ

2

Если вы действительно действительно хотите этого вы посмотрите на TestFixtureSetUp может.

Вот введение:

Этот атрибут используется внутри TestFixture, чтобы обеспечить единый набор функций, которые выполняются один раз перед выполнением любого из тестов в арматуре. В TestFixture может быть только один метод TestFixtureSetUp. Если определено более одного, TestFixture будет успешно скомпилироваться, но его тесты не будут выполняться.

Пример:

namespace NUnit.Tests 
{ 
    using System; 
    using NUnit.Framework; 

    [TestFixture] 
    public class SuccessTests 
    { 
    [TestFixtureSetUp] public void Init() 
    { /* ... */ } 

    [TestFixtureTearDown] public void Dispose() 
    { /* ... */ } 

    [Test] public void Add() 
    { /* ... */ } 
    } 
} 

Но вы должны использовать это с осторожностью, иначе она побеждает the purpose of unit test.

9

Вы этого не сделаете.

У вас нет собственных тестов класс, который вы используете в реальном коде; вы пишете свои тесты, внешние по отношению к классам. Я считаю, что большинство испытательных комплексов имеют концепцию «Teardown» и наоборот; для настройки тестовой среды для данного исполнения.

+0

100% правильный. Для OP - вы также не должны пытаться создавать специальные конструкторы только для теста. Если вам нужно иметь конструктор, чтобы принимать зависимости, и единственное, что его использует, это тесты, это нормально, но этот конструктор не должен скрываться от всех остальных. Это делает ваш класс более гибким, чтобы потребители могли проходить в зависимостях. – womp

+0

Согласен. Это абсолютно неправильный способ сделать это. Создайте отдельный класс и используйте атрибуты Setup и Teardown – lomaxx

3

Чтобы дать быстрый пример правильного подхода шелковистой в:

public class MyClass 
{ 
    // ... 
} 

// In a different assembly: 

[TestFixture] 
public class TestMyClass 
{ 
    [SetUp] 
    public void SetUp() 
    { 
     _myClass = new MyClass(); 
    } 

    [Test] 
    public void FooReturnsTrue() 
    { 
     Assert.That(_myClass.Foo(), Is.True); 
    } 

    // more tests 

    private MyClass _myClass; 
} 
Смежные вопросы