0

在 Visual Studio 2008、C#、Entity Framework 3.5、MS Test 中,我有两个测试:

[TestMethod]
public void Test1()
{
    using (Entities context = new Entities())
    {
        using (TransactionHelper transaction = new TransactionHelper(context))
        {
            // Stuff

            transaction.Rollback();
        }
    }
}

和:

[TestMethod]
public void Test2()
{
    using (Entities context = new Entities())
    {
        using (TransactionHelper transaction = new TransactionHelper(context))
        {
            // Stuff

            transaction.Rollback();
        }
    }
}

单独运行它们时,它们都通过了。但是当我运行所有测试时,第二个测试会显示以下内容:

System.InvalidOperationException:无法定义两个对象之间的关系,因为它们附加到不同的 ObjectContext 对象。

我完全不明白这一点。我没有在代码路径中创建新的实体对象。我检查了几次(并且看到代码在单独的测试运行生产使用中是如何工作的,这一定是真的)。我什至将实体包装在 using 语句中。

TestContext 中是否有一些奇怪的保留?

作为参考,TransactionHelper(简化):

public class TransactionHelper : IDisposable
{
    private global::System.Data.Objects.ObjectContext _context;
    private ConnectionState _initialConState;
    private DbTransaction _transaction;

    public TransactionHelper(global::System.Data.Objects.ObjectContext context)
    {   
        _context = context;
        _initialConState = context.Connection.State;

        if (_initialConState != ConnectionState.Open)
        {
            _context.Connection.Open(); // open connection if not already open
        }

        _transaction = _context.Connection.BeginTransaction(IsolationLevel.ReadUncommitted);
    }

    public void Rollback()
    {
        _transaction.Rollback();
    }

    public void Commit()
    {
        _transaction.Commit();
    }

    public void Dispose()
    {
        _transaction.Dispose();

        if (_initialConState != ConnectionState.Open)
        {
            _context.Connection.Close(); // only close connection if not initially open
        }
    }
}

如果我使用隔离级别没有区别ReadCommitted

4

1 回答 1

1

由于单元测试在理想情况下应该彼此完全独立(在状态、顺序等方面),Visual Studio 和其他测试框架(如 NUnit)通过并行运行它们来加速执行过程。在像你这样的情况下,共享静态资源通常是我的罪魁祸首。

可能是您提到的这些简单对象(例如一些查找值)被分配给实体对象的属性,然后在第二个测试中您将相同的简单对象分配给另一个上下文的实体,这会引发错误,例如你提到的。

如果是这种情况,那么您可以尝试在测试中模拟缓存(或者尽可能减少使用static)。

于 2012-06-28T11:34:05.827 回答