NUnit теперь имеет [Откат] атрибут, но я предпочитаю делать это различный путь. Я использую класс TransactionScope . Существует несколько способов использовать его.
[Test]
public void YourTest()
{
using (TransactionScope scope = new TransactionScope())
{
// your test code here
}
}
, Так как Вы не сказали, TransactionScope для фиксации его будет откатывать автоматически. Это работает, даже если утверждение перестало работать, или некоторое другое исключение выдается.
другой путь состоит в том, чтобы использовать [Установка] для создания TransactionScope, и [Разрушение] для вызова Располагают на нем. Это отключает некоторое дублирование кода, но выполняет то же самое.
[TestFixture]
public class YourFixture
{
private TransactionScope scope;
[SetUp]
public void SetUp()
{
scope = new TransactionScope();
}
[TearDown]
public void TearDown()
{
scope.Dispose();
}
[Test]
public void YourTest()
{
// your test code here
}
}
Это столь же безопасно как оператор использования в отдельном тесте, потому что NUnit гарантирует, что TearDown называют.
сказавший все, что я действительно думаю, что тестирует тот хит, база данных не является действительно модульными тестами. Я все еще пишу им, но я думаю о них как об интеграционных тестах. Я все еще рассматриваю их как обеспечение значения. Одно место я использую их часто, находится в тестировании LINQ к коду SQL. Я не использую разработчика. Я вручаю записи DTO и атрибуты. Я, как было известно, понял его превратно. Справка интеграционных тестов ловит мою ошибку.
Я просто перешел к группе пользователей.NET, и предъявитель сказал, что использовал SQLlite в тестовой установке и разрушении и использовал в параметре памяти. Он должен был уклониться от соединения немного, и явный уничтожают соединение, но это дало бы чистому DB каждый раз.
http://houseofbilz.com/archive/2008/11/14/update-for-the-activerecord-quotmockquot-framework.aspx
Я назвал бы эти интеграционные тесты, но неважно. То, что я сделал для таких тестов, имеют мои методы установки в тестовом классе, ясном все таблицы процентов перед каждым тестом. Я обычно вручаю записи SQL, чтобы сделать это так, чтобы я не использовал классы под тестом.
Обычно я полагаюсь на ORM для своего datalayer, и таким образом я не пишу модульные тесты на очень там. Я не чувствую потребность к коду модульного теста, который я не пишу. Для кода, который я добавляю в слое, я обычно использую внедрение зависимости в краткий обзор фактическое соединение к базе данных так, чтобы, когда я тестирую свой код, это не касалось фактической базы данных. Сделайте это в сочетании с платформой насмешки для лучших результатов.
Для этого вида тестирования я экспериментировал с NDbUnit (работающий дружно с NUnit). Если не изменяет память, это был порт DbUnit с платформы Java. Это имело много гладких команд для просто вида вещи, которую Вы пытаетесь сделать. Проект, кажется, переехал сюда:
http://code.google.com/p/ndbunit/
(это раньше было в http://ndbunit.org ).
источник, кажется, доступен по этой ссылке: http://ndbunit.googlecode.com/svn/trunk/
Рассмотрите возможность создания сценария базы данных, чтобы его можно было запускать автоматически из NUnit, а также вручную для других видов тестирования. Например, если вы используете Oracle, запустите SqlPlus из NUnit и запустите скрипты. Такие сценарии обычно быстрее пишутся и легче читаются. Кроме того, что очень важно, запуск SQL из Toad или аналогичного приложения более нагляден, чем запуск SQL из кода или прохождение через ORM из кода. Обычно я создаю скрипт установки и скрипт разрушения и помещаю их в методы установки и разрушения.
Стоит ли вообще обращаться к БД из модульных тестов - это другая дискуссия. Я считаю, что часто это имеет смысл делать. Для многих приложений база данных является абсолютным центром действия, логика в значительной степени основана на множествах, а все остальные технологии, языки и методы являются призраками. И с развитием функциональных языков мы начинаем понимать, что SQL, как и JavaScript, на самом деле является отличным языком, который все эти годы был у нас под носом".
Просто в качестве примера, Linq to SQL (который мне нравится по концепции, но я никогда не использовал его) кажется мне способом делать сырой SQL внутри кода, не признаваясь в том, что мы делаем. Некоторые люди любят SQL и знают, что он им нравится, другие любят его и не знают, что он им нравится :)
.