簡體   English   中英

測試后 NUnit 回滾

[英]NUnit Rollback After Test

我對 NUnit(以及一般的自動化測試)很陌生。 我最近做了一些 Ruby On Rails 工作,並注意到在我的測試套件中,當我創建對象(例如新用戶)並在套件過程中提交它們時,它們永遠不會提交到數據庫,以便我可以運行一遍又一遍地測試,而不必擔心該用戶已經存在。

我現在正試圖在 NUnit 中完成同樣的事情,但我不太確定如何 go 來做這件事。 我是否在 Setup 和 Teardown 塊中創建事務? 謝謝。

為什么要在單元測試期間與數據庫交談? 默認情況下,這會使您的單元測試成為集成測試。 相反,為所有數據庫通信創建包裝器,並在單元測試期間存根/模擬它。 那你就不用擔心前后的數據庫state了。

現在,如果您不願意進行那種級別的重構:事務的問題是您需要一個開放的連接。 因此,如果您的測試目標方法自己處理所有通信,則很難注入您可以在設置時創建並在拆卸時回滾的事務。

也許你可以使用這個。 它很丑陋,但也許它可以為您工作:

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;
    }
} 

我同意 Morten 的回答,但您可能想查看這篇關於該主題的非常古老的 MSDN 雜志文章:了解您的代碼:使用企業服務簡化數據層單元測試

我使用 SQLite 進行單元測試,使用 NHibenate。 即使您不使用 NHibernate 也應該可以這樣做。 SQLite 有一個在 memory 模式下,您可以在 memory 模式下創建數據庫並在那里保存數據。 它速度快,運行良好,您可以簡單地丟棄並重新創建您認為合適的每個測試或夾具的模式。

您可以查看Ayende 博客中的示例,了解其完成方式的概述。 他正在使用 NHibernate,但該概念也適用於其他 ORM 或直接 DAL。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM