在集成测试Web API时使用TransactionScope

8
目前,我正在做类似于this的事情来集成测试一个与我们的API控制器通信的库,到目前为止都很好,但我遇到了一个问题。在我们所有其他的集成测试中,我们在MSDTC事务中以ReadCommitted隔离级别运行测试,以便每个测试都有自己的小型私有会话与数据库等,并且在每个测试结束时,事务都会回滚。但是对于这些测试,这种方法不起作用,因为事务是针对每个线程的,而所有HttpClient / HttpServer方法都是异步的,因此工作是在与该测试的主线程不同的线程上完成的,没有环境事务可供订阅,并直接提交。
我看到过一些关于如何在一个线程上打开TransactionScope,然后通过闭包创建一个依赖事务传递给新任务的帖子,但我不知道如何将其应用于连接到内存中的HttpServer的HttpClient。我怀疑我只是没有正确地思考它,但这就是我所拥有的。

有哪些做法是合理的/可行的?我完全掌控了HttpServer和将连接到它的HttpClient的创建,但我不知道该怎么做。

更新:

取得了一些进展——我编写了一个消息处理程序,可以在工作线程上创建一个依赖事务,如果当它到达时已经填充了Transaction.Current,并且对于我的一些调用来说,确实填充了,但对于其他调用来说,却没有填充,我想知道我是否在追踪幻影——比如,周围有很多ContinueWith,如果前置任务已经完成,则我认为它在调用线程上执行(自然会有一个事务)。

是否可能只同步运行整个过程并一直保持测试线程?我尝试了一些同步ContinueWith,但没有太大的成功。

2个回答

0
事实证明,HttpClient和HttpServer没有启动后台线程-相反,我在代码中有一些错误的Task.StartNew导致了问题。将其移除后,问题得以解决。

0

如果您不一定要使用真正的HTTP连接,您可以通过代码直接调用接口(使用程序集引用),从允许您执行每个会话或每个测试启动和关闭工作的测试框架中调用它们(例如MSTest的类和测试初始化函数)。在这种情况下,您将打开一个TransactionScope,该范围在类中共享,并在类或测试关闭函数中处理它。因为您没有调用.Commit(),所以它将回滚事务期间发生的操作。


这就是我们目前测试控制器的方式,但是想法是测试C#库与Web API通信的交互,这需要使用真正的HTTP连接。好消息是,我认为我找到了答案——HttpServer对象在异步调用时似乎不会启动线程,但我的客户端代码却完全没有必要地启动了线程。我把那些东西拿出来了,现在它可以正常工作了。 - William Scalf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接