TestInitialize中的TransactionAbortedException

时间:2017-09-28 02:10:41

标签: c# unit-testing vs-unit-testing-framework

我的单元测试有一个基类,可以围绕每个测试设置一个简单的事务。

public class TestBase
{
    TransactionScope _trans;

    [TestInitialize()]
    public void Init()
    {
        _trans = new TransactionScope();
    }

    [TestCleanup()]
    public void Cleanup()
    {
        _trans.Dispose();
    }
}

在我的一个继承类中,我有一堆我想要做的工作,在运行任何这些测试之前 - 这应该在完成所有类的测试后回滚。

 [TestClass]
public class MyTests : TestBase
{
    static TransactionScope  _transClass;
    [ClassInitialize()]
    public static void ClassInit(TestContext context)
    {
        _transClass = new TransactionScope();
      //do some setup
    }

    [ClassCleanup()]
    public static void ClassCleanup()
    {
        _transClass.Dispose();
    }

    [TestMethod()]
    public void TestMethod()
    {
        //do some testing
    }
}

我的实际课程当然有多种测试方法。第一个测试方法传递正常,但第二个测试方法尝试在TestInitialize中设置新的TransactioScope时抛出TransactionAbortedException。有人可以解释我在这里设置的错误吗?

1 个答案:

答案 0 :(得分:0)

我怀疑基类TestBase可能在每次测试后对连接做了些什么。

最好使用using语句进行交易 - 它可以消除像你这样的问题。

在单个事务中进行多次测试也不是一个好主意,这意味着测试是相互依赖的。这导致在测试通过或失败时难以跟踪问题,这取决于它是在组中运行还是单独运行。

总之,我建议不要为事务创建成员字段,而是使用带有using语句的局部变量。