Существуют ли .net-эквиваленты для светильников Rails? - PullRequest
3 голосов
/ 24 февраля 2009

Я ищу проект / инструмент, который вставит данные в базу данных перед тестом и откатит его после запуска теста.

Я знаю, что у ruby ​​on rails есть приспособления yaml, поэтому я надеялся, что есть проект для .net проектов.

Ответы [ 2 ]

2 голосов
/ 27 октября 2011

Существует несколько хороших способов предоставления данных для тестирования в .NET. Одним из них является использование функций, встроенных в NUnit, таких как параметризованные тесты и теории.

Параметризованные тесты:

TestCaseAttribute позволяет легко предоставлять жестко закодированные данные для теста, как в следующем примере с nunit.org:

[TestCase(12,3, Result=4)]
[TestCase(12,2, Result=6)]
[TestCase(12,4, Result=3)]
public int DivideTest(int n, int d)
{
  return( n / d );
}

TestCaseDataAttribute позволяет вам гораздо более изощренно представлять данные (например, возвращать данные из базы данных).

Транзакции для отката

Другой часто используемый трюк - использование транзакций. По сути, запустите транзакцию до теста и откатите ее после. Это может даже быть автоматизировано с использованием базового класса, так что ваши тесты вообще не связаны с самими транзакциями. Например, у вас может быть базовый класс для вашего тестового устройства, например:

public class TestBase
{
    private TransactionScope _transacation;

    [SetUp]
    public virtual void InitializeTest()
    {
        //NOTE: Base class TestInitialize methods are called before test Initialize methods in derived class.

        // Setup a DB transcation to roll everything back after the tests.
        if (_transacation != null)
            throw new Exception("old transacation still exists");
        // Give a long timeout on this transacation for debugging...
        _transacation = new TransactionScope(TransactionScopeOption.RequiresNew, TimeSpan.FromSeconds(60));   
    }

    [TearDown]
    public virtual void CleanupTest()
    {

        // Roll all the changes made during the test back.
        _transacation.Dispose();
        _transacation = null;
    }
}

Поскольку декорированные методы TestInitialize в базовом классе называются до Методы TestInitialize в производном классе, вы даже можете добавить некоторые данные в базу данных в методе TestInitialize вашего родительского класса.

Родительский класс может выглядеть так:

[TestFixture]
public class MyClassTests : TestBase
{
    [TestFixtureSetUp]
    public void InitializeUnit()
    {
            //Setup mocks...
    }

    [SetUp]
    public override void InitializeTest()
    {   
            base.InitializeTest();
            // Add test data to database
    }

    [Test]
    public void RealTest()
    {
            ...
    }
}
0 голосов
/ 24 февраля 2009

Я использую Sql Server Compact Edition и создаю новую копию базы данных каждый раз (достаточно просто скопировать исходную базу данных), а при использовании в режиме только для чтения несколько тестов могут использовать один и тот же файл базы данных.

Есть несколько ошибок, и программируемость не поддерживается, но она хорошо работает для основ, для которых я нуждался. Это также удивительно быстро.

...