测试后NUnit回滚

ska*_*kaz 7 asp.net nunit unit-testing asp.net-mvc-3

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

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

Mor*_*ten 5

为什么在单元测试期间会与数据库通信?这使得您的单元测试默认为集成测试.相反,为所有数据库通信创建包装器,并在单元测试期间对其进行存根/模拟.然后您不必担心之前和之后的数据库状态.

现在,如果您不愿意进行这种级别的重构:事务的问题是您需要一个开放的连接.因此,如果针对测试的方法自己处理所有通信,则很难注入可以在安装时创建的事务并在拆卸时回滚.


Mor*_*ten 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;
    }
} 
Run Code Online (Sandbox Code Playgroud)

  • 如果您的测试无法访问`SqlConnection`,那么`TransactionScope`可能比`SqlTransaction`更容易.请参见http://stackoverflow.com/questions/321180/how-do-i-test-database-related-code-with-nunit (2认同)