Rails灯具有.net等价物吗?

时间:2009-02-24 14:52:11

标签: .net unit-testing yaml fixture

我正在寻找一个项目/工具,它会在测试之前将数据插入数据库,并在测试运行后将其回滚。

我知道轨道上的红宝石有yaml固定装置,所以我希望有.net项目的项目。

2 个答案:

答案 0 :(得分:2)

有几种很好的方法可以为.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让您在提供数据方面更加流行(例如从数据库返回数据)。

回滚事务

经常使用的另一个技巧是依赖交易。基本上,在测试之前启动一个Transaction,然后在之后回滚。这甚至可以使用基类自动执行,因此您的测试根本不处理事务本身。例如,您可能拥有测试夹具的基类,如下所示:

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()
    {
            ...
    }
}

答案 1 :(得分:0)

我使用Sql Server Compact Edition并每次重新生成数据库的新副本(只需复制初始数据库就可以了),如果在只读模式下使用,则多个测试可以共享同一个数据库文件。

有一些陷阱,并且不支持可编程性,但它适用于我需要它的基础知识。它的速度也令人惊讶。