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.
您的异常是说未启用 MSDTC。我的猜测是,当您单独使用 TransactionScope 时,它只是创建本地 SQL 事务——不需要 DTC。但是,当您通过多个连接共享 TransactionScope 时,事务会通过 DTC“提升”为分布式事务,而您可能尚未启用 DTC。
尝试在本地计算机和服务器上的 MSDTC 上启用网络访问。根据您的操作系统,执行此操作的步骤略有不同。以下是在 Win 2003 Server 中执行此操作的方法。 这是 Win 2008 的链接。请注意,您可能还需要通过防火墙启用 DTC(在最后一个链接中进行了说明...)
| 归档时间: |
|
| 查看次数: |
4600 次 |
| 最近记录: |