当用于数据库单元测试时,TransactionScope会导致TransactionManagerCommunicationException

Gor*_*ger 5 c# database unit-testing transactionscope

我想在我的数据库中运行一些存储过程的测试而不会实际影响数据(或者,更准确地说,在测试运行后没有持久的影响).

经过一些研究,我想出了在我的Visual Studio 2010测试项目中使用TransactionScope的方法,例如

using( new TransactionScope())
{
    using( SqlConnection connection = new SqlConnection("someConnectionString"))
    {
        connection.Open();
        using( SqlCommand command = new SqlCommand( "some sql", connection ))
        {
            // Do some database stuff...
        }
     }
}
Run Code Online (Sandbox Code Playgroud)

现在这个工作正常,只要我将所有这些都放在一个测试方法中,即当TransactionScope的using块完成时,我对数据库的所有更改都会自动回滚.

我现在的问题是我想在ClassInitialize中做一些数据库工作,所以我只需要为每个测试类做一次而不是每个测试方法.当我创建一个公共TransactionScope属性并在ClassInitialize方法中为它分配一个TransactionScope实例时,这没关系.一旦我在我的一个测试方法中执行任何与数据库相关的东西,我就会在该方法中遇到TransactionManagerCommunicationException.

我不太明白为什么会这样,我也想知道我的方法是否存在错误,或者如何在不设置TransactionScope(包括所有设置的东西)的情况下使其工作.再次测试每种测试方法.

编辑

代码摘录如下,我希望这能提供足够的信息:

public TransactionScope Scope { get; set; }

[ClassInitialize]
public static void ClassInitialize( TestContext testContext )
{
    Scope = new TransactionScope();
    // Do some db set up stuff, e.g. create records used for tests etc.
}

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

[TestMethod]
public void MyTestMethod()
{
    using( SqlConnection connection = new SqlConnection( "someConnectionString" ) )
    {
        DataTable result = new DataTable();
        using( SqlCommand command = new SqlCommand( "spName", connection ) )
        {
            command.CommandType = CommandType.StoredProcedure;
            using( SqlDataAdapter adapter = new SqlDataAdapter() )
            {
                adapter.SelecteCommand = command;
                // The next line causes the exception to be thrown
                adapter.Fill( result );
            }
        }

        // Assertions against DataTable result
    }
}
Run Code Online (Sandbox Code Playgroud)

例外是


用户代码未处理TransactionManagerCommunicationException已禁用分布式事务管理器(MSDTC)的网络访问.请使用组件服务管理工具在MSDTC的安全配置中启用DTC以进行网络访问.


我知道我可以尝试更改设置,但我不明白为什么我开始使用异常 - 与在单个(测试)方法中使用上述代码相比有什么不同?

在此先感谢

最好的祝福

G.

ble*_*ech 4

您的异常是说未启用 MSDTC。我的猜测是,当您单独使用 TransactionScope 时,它​​只是创建本地 SQL 事务——不需要 DTC。但是,当您通过多个连接共享 TransactionScope 时,事务会通过 DTC“提升”为分布式事务,而您可能尚未启用 DTC。

尝试在本地计算机和服务器上的 MSDTC 上启用网络访问。根据您的操作系统,执行此操作的步骤略有不同。以下是在 Win 2003 Server 中执行此操作的方法这是 Win 2008 的链接。请注意,您可能还需要通过防火墙启用 DTC(在最后一个链接中进行了说明...)