Откат NUnit после теста - PullRequest
       2

Откат NUnit после теста

7 голосов
/ 28 апреля 2011

Я довольно новичок в NUnit (и вообще в автоматическом тестировании).Недавно я выполнил некоторую работу на Ruby On Rails и заметил, что в моем тестовом наборе, когда я создаю объекты (например, нового пользователя) и фиксирую их во время этого набора, они никогда не фиксируются в базе данных, поэтому я могутестируйте снова и снова и не беспокойтесь о том, что пользователь уже существует.

Сейчас я пытаюсь выполнить то же самое в NUnit, но я не совсем уверен, как это сделать.Создать транзакцию в блоках Setup и Teardown?Спасибо.

Ответы [ 4 ]

5 голосов
/ 28 апреля 2011

Может быть, вы можете использовать это.Это некрасиво, но, возможно, это может сработать для вас:

namespace SqlServerHandling
{
[TestFixture]
public sealed class TestTransactionRollBacks
{

    private string _connectionString = "Data Source = XXXDB; ; Initial Catalog = XXX; User Id = BLABLA; Password = BLABLA";
    private SqlConnection _connection;
    private SqlTransaction _transaction; 


    [SetUp]
    public void SetUp()
    {
        _connection = new SqlConnection(_connectionString);
        _transaction = _connection.BeginTransaction();
    }

    [TearDown]
    public void TearDown()
    {
       _transaction.Rollback();
    }


    [Test]
    public void Test()
    {
        Foo foo = new Foo(_connection);

        object foo.Bar();



    }


}

internal class Foo
{
    private readonly SqlConnection _connection;
    object someObject = new object();
    public Foo(SqlConnection connection)
    {
        _connection = connection;
    }

    public object Bar()
    {
        //Do your Stuff
        return someObject;
    }
} 
5 голосов
/ 28 апреля 2011

Зачем вам разговаривать с базой данных во время юнит-тестов?Это превращает ваш юнит-тест в интеграционные тесты по умолчанию.Вместо этого создайте обертки для всех соединений с базой данных и вставьте их в тупик во время юнит-тестов.Тогда вам не нужно беспокоиться о состоянии базы данных до и после.

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

3 голосов
/ 28 апреля 2011

Я согласен с ответом Мортена, но, возможно, вы захотите взглянуть на эту очень старую статью в журнале MSDN на эту тему: Знайте свой код: упростите модульное тестирование на уровне данных с использованием корпоративных сервисов

0 голосов
/ 28 апреля 2011

Я использую SQLite для модульных тестов, используя NHibenate.Даже если вы не используете NHibernate, это должно быть возможно сделать.SQLite имеет режим в памяти, где вы можете создать базу данных в памяти и сохранить там данные.Это быстро, работает хорошо, и вы можете просто выбросить и воссоздать схему для каждого теста или прибора по своему усмотрению.

Вы можете увидеть t пример из блога Ayende дляОбзор того, как это сделано.Он использует NHibernate, но концепция должна работать и с другим ORM или прямым DAL.

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