我可以创建环境事务进行测试吗?

时间:2015-10-22 13:52:25

标签: sql-server testing transactions transactionscope

我当前的系统有一个相当激进的数据层,通过调用静态方法为我创建一个SqlDatabase实例。我传入一个存储过程名称(字符串),只是发生了魔法。

我想尝试让一些这个疯狂的系统受到测试,因此想要控制数据库中的内容。

意识到这个结构

[Test]
public void Should_do_some_thing()
{   
  using (var scope = new TransactionScope())
            {
                CleanUpDatabase();
                SetupDatabaseData();

                //Run Test

                Assert.That(someResult,Is.EqualTo("ExpectedValue");

                scope.Dispose();
            }
}

做我想做的事情(测试之外没有数据库更改持续存在)如果我可以在[SetUp]方法中设置事务并且在[TearDown]部分没有提交的情况下删除,那么显然会更好。< / p>

这可能吗?

注意我无法调用command对象上的任何方法或其他...

1 个答案:

答案 0 :(得分:1)

您可以使用TestInitializeTestCleanup进行设置/清理:

private TransactionScope scope;

[TestInitialize]
public void TestInitialize()
{
    scope = new TransactionScope();
    CleanUpDatabase();
    SetupDatabaseData();
}

[Test]
public void Should_do_some_thing()
{   
    //Run Test

    Assert.That(someResult,Is.EqualTo("ExpectedValue");
}

[TestCleanup]
public void CleanUp()
{
    scope.Dispose();
}

您可能需要添加错误处理等,但这是它的基础:

TestInitialize

  

标识在测试之前运行的方法,以分配和配置测试类中所有测试所需的资源。这个类不能被继承。

TestCleanUp

  

标识一种方法,该方法包含在运行测试后必须使用的代码,并释放测试类中所有测试获得的资源。这个类不能被继承。

如果您使用的是NUNIT,那么您可以分别使用[SetUp][TearDown]代替[TestInitialize][TestCleanUp]