我对NUnit很新(以及一般的自动化测试)。我最近做了一些Ruby On Rails工作,并注意到在我的测试套件中,当我创建对象(例如新用户)并在套件的过程中提交它们时,它们永远不会被提交到数据库以便我可以运行反复测试,不要担心用户已经存在。
我现在正试图在NUnit中完成同样的事情,但我不太清楚如何去做。我是否在Setup和Teardown块中创建了一个事务?感谢。
答案 0 :(得分:5)
为什么在单元测试期间会与数据库通信?这使得您的单元测试默认为集成测试。相反,为所有数据库通信创建包装器,并在单元测试期间对其进行存根/模拟。然后您不必担心之前和之后的数据库状态。
现在,如果你不愿意那种重构:事务的问题是你需要一个开放的连接。因此,如果针对测试的方法自己处理所有通信,则很难注入可以在安装时创建的事务并在拆卸时回滚。
答案 1 :(得分:5)
也许你可以使用它。这很难看,但也许它对你有用:
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;
}
}
答案 2 :(得分:3)
我同意Morten的回答,但你可能想看看这篇关于这个主题的MSDN杂志这篇文章:Know Thy Code: Simplify Data Layer Unit Testing using Enterprise Services
答案 3 :(得分:0)
我使用SQLite进行单元测试,使用NHibenate。即使你没有使用NHibernate也应该可以做到。 SQLite具有内存模式,您可以在内存中创建数据库并在其中保留数据。它速度快,效果很好,您可以随意丢弃并根据需要重新创建每个测试或夹具的架构。
您可以看到t he example from Ayende's blog,了解其完成情况。他正在使用NHibernate,但这个概念应该与其他ORM或直接DAL一起使用。