【问题标题】:Using TransactionScope when integration testing web apis在集成测试 Web api 时使用 TransactionScope
【发布时间】:2013-01-05 06:52:04
【问题描述】:

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

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

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

更新:

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

是否有可能只同步运行整个事情并一直执行测试线程?我已经尝试了一些与 ContinueWith'ing 同步但没有取得多大成功..

【问题讨论】:

    标签: c# asp.net-web-api task-parallel-library integration-testing transactionscope


    【解决方案1】:

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

    【讨论】:

    • 嗯,这就是我们目前测试控制器的方式,但我们的想法是测试抽象与 Web api 通信的 C# 库之间的交互,这需要使用真正的 HTTP 连接。从好的方面来说,我想我找到了答案—— HttpServer 对象似乎没有在异步调用上启动线程,但我的客户端代码却完全没有必要。我把那些东西拿出来了,效果很好。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-15
      • 2023-04-05
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多