测试后NUnit回滚

时间:2011-04-28 12:34:11

标签: asp.net unit-testing asp.net-mvc-3 nunit

我对NUnit很新(以及一般的自动化测试)。我最近做了一些Ruby On Rails工作,并注意到在我的测试套件中,当我创建对象(例如新用户)并在套件的过程中提交它们时,它们永远不会被提交到数据库以便我可以运行反复测试,不要担心用户已经存在。

我现在正试图在NUnit中完成同样的事情,但我不太清楚如何去做。我是否在Setup和Teardown块中创建了一个事务?感谢。

4 个答案:

答案 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一起使用。