Существует несколько хороших способов предоставления данных для тестирования в .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()
{
...
}
}