我在webapi/signer应用程序上的E2E测试单独成功运行,但如果是批量的,则不会成功
本文关键字:成功 如果 运行 单独 signer webapi 应用 应用程序 测试 E2E 程序上 | 更新日期: 2023-09-27 18:20:19
如果重要的话,我使用的是:
- xUnit用于测试运行程序
-
C#4.5.1(这样我就可以利用
TransactionScopeAsyncFlowOption.Enabled
,只需跨线程回滚事务——[AutoRollback]
不起作用) - Protractor.NET用于浏览器/驱动程序(客户端使用Angular)
- Owin自行托管网站(如果这是正确的术语)
- EntityFramework在每次测试前设置测试数据,并在我的应用程序中进行大多数数据访问
当我通过右键单击来单独运行每个测试时,一切都很好。然而,每当我使用测试运行程序/测试资源管理器运行它们时,除了第一次抛出异常之外,其他都会抛出异常。
我遵循的是Arrange-Act Assert模式。在"安排"期间,我打电话给DbContext.SaveChanges()
。这时抛出了这个错误:
Result Message:
System.Exception : The underlying provider failed on Open.
---- System.Data.Entity.Core.EntityException : The underlying provider failed on Open.
-------- System.Transactions.TransactionException : The operation is not valid for the state of the transaction.
------------ System.Transactions.TransactionPromotionException : Failure while attempting to promote transaction.
---------------- System.Data.SqlClient.SqlException : There is already an open DataReader associated with this Command which must be closed first.
-------------------- System.ComponentModel.Win32Exception : The wait operation timed out
我试过在谷歌上搜索几个错误。在我的连接字符串中启用MARS并没有解决问题。延长我的连接串中的超时并没有解决它。
我想:也许有人对这种嵌套异常模式有所了解,并能为一个确切的问题提供一些线索。
如果没有,我接下来的诊断步骤是什么,以找出抛出异常的原因?
我在代码的WebApi端点中显式地创建了一个SqlConnection
/SqlDataAdapter
,该端点动态地创建了测试2和3正在调用而测试1没有调用的SQL查询。我在问题中描述的最外层回滚事务以及SqlConnection
导致WebApi端点中的connection.Open()
调用升级为由DTC处理。
我发现了这一点,把它放在我的引导程序代码:
TransactionManager.DistributedTransactionStarted += TransactionManager_DistributedTransactionStarted;
// ...
void TransactionManager_DistributedTransactionStarted(object sender, TransactionEventArgs e)
{
throw new Exception("DistributedTransactionStarted");
}
目前(我最终只会在这些E2E测试中做以下操作),我重写了我的Ninject代码,为SqlConnection
s使用singletons,并使其成为DbContext
不拥有连接的对象。这解决了我上面遇到的异常,因此回答了这个问题(尽管我现在遇到了不同的错误)。(我想我最后也把MARS放回了我的连接字符串中,但那可能是因为另一个异常-记不清了。)