8

目前,我正在做类似的事情集成测试与我们的 API 控制器通信的库,到目前为止一切都很好,但我遇到了障碍。在我们所有的其他集成测试中,我们在隔离级别 ReadCommitted 的 MSDTC 事务中运行测试,以便每个人都有自己的与数据库等的小型私人会话,并且在每次测试结束时,事务都会回滚。..但这不适用于这些测试,因为事务是每个线程的,并且所有 HttpClient/HttpServer 方法都是异步的,因此工作是在与该测试的主线程不同的线程上完成的,没有要订阅的环境事务,并继续并提交。

我遇到过一些关于如何在一个线程上打开 TransactionScope 然后创建一个依赖事务以通过闭包传递给新任务的帖子,但我不知道如何将其应用于连接到一个内存中的 HttpServer。我怀疑我只是没有以正确的方式思考它,但这就是我所要做的。

什么有意义/工作/等等?我可以完全控制 HttpServer 和将连接到它的 HttpClient 的创建,但我不知道如何处理它们。

更新:

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

是否有可能只同步运行整个事情并一直携带测试的线程?我已经用 ContinueWith'ing 同步进行了一些实验,但没有取得多大成功。

4

2 回答 2

0

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

于 2013-01-08T17:38:40.317 回答
0

事实证明,HttpClient 和 HttpServer并没有启动后台线程——相反,我的代码中有一些错误的 Task.StartNew 导致了问题。删除那些让我走了。

于 2013-01-18T18:19:41.123 回答