8

現時点では、APIコントローラーと通信するライブラリを統合テストするためにこれと同様のことを行っていますが、これまでのところうまくいっていますが、問題が発生しました。他のすべての統合テストでは、MSDTCトランザクション内で分離レベルReadCommittedでテストを実行し、各テストがデータベースなどとの独自の小さなプライベートセッションを取得し、各テストの最後にトランザクションがロールバックされるようにします。..しかし、トランザクションはスレッドごとであり、すべてのHttpClient / HttpServerメソッドは非同期であるため、これらのテストでは機能しません。そのため、作業はそのテストのメインスレッドとは異なるスレッドで実行されます。サブスクライブするアンビエントトランザクションであり、すぐに実行されてコミットされます。

1つのスレッドでTransactionScopeを開き、クロージャーを介して新しいタスクに渡される依存トランザクションを作成する方法についていくつかの投稿に出くわしましたが、それに接続されているHttpClientにそれを適用する方法がわかりません。インメモリHttpServer。私はそれを正しい方法で考えていないのではないかと思いますが、それが私が続けなければならないことのすべてです。

何が理にかなっている/仕事/など?HttpServerとそれに接続するHttpClientの作成を完全に制御できますが、それらをどう処理するかについて迷っています。

アップデート:

いくつかの進歩がありました-Transaction.Currentがそこに到達したときに入力され、一部の呼び出しではそうではない場合、ワーカースレッドに依存するトランザクションを作成できるメッセージハンドラーを作成しました。シャドウを追いかけているのではないかと思います。たとえば、ContinueWithがたくさんあり、先行タスクがすでに完了している場合は、呼び出し元のスレッド(当然トランザクションがあります)で実行されると思います。

すべてを同期して実行し、テストのスレッドを最後まで実行することは可能でしょうか?私はContinueWithを同期的に試してみましたが、あまり成功しませんでした。

4

2 に答える 2

0

結局のところ、HttpClient と HttpServerはバックグラウンド スレッドをスピンアップしていませんでした。むしろ、コードに誤った Task.StartNew があり、それが問題の原因でした。それらを削除すると、私は行きました。

于 2013-01-18T18:19:41.123 に答える
0

実際の HTTP 接続の使用に固執していない場合は、セッションごとまたはテストごとの起動とシャットダウン作業 (MSTest のクラスやテスト初期化関数など)。この場合、メンバー変数でクラス全体で共有される TransactionScope を開き、それをクラスまたはテスト シャットダウン関数で破棄します。.Commit() を呼び出さなかったので、トランザクション中に発生した操作をロールバックします。

于 2013-01-08T17:38:40.317 に答える