NUnit выполняется с альтернативным конструктором - PullRequest
2 голосов
/ 18 сентября 2009

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

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

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

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

Возможно ли это вообще?

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

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

Ответы [ 3 ]

9 голосов
/ 18 сентября 2009

Ты этого не делаешь.

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

3 голосов
/ 18 сентября 2009

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

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;
}
2 голосов
/ 18 сентября 2009

Если вы действительно действительно хотите этого, вы можете взглянуть на 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()
    { /* ... */ }
  }
}

Но вы должны использовать это с осторожностью, иначе это победит цель юнит-теста .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...