8

目前,我正在做一些類似於this的集成測試,以便與我們的API控制器進行通信的庫,並且迄今爲止非常好,但我遇到了麻煩。在所有其他集成測試中,我們在隔離級別爲ReadCommitted的MSDTC事務內部運行測試,以便每個人都可以與數據庫等進行自己的小私人會話,並且在每次測試結束時,事務都會回滾。 ..但這並不適用於這些測試,因爲事務是每線程的,並且所有HttpClient/HttpServer方法都是異步的,所以工作是在與測試主線程不同的線程上完成的,沒有一個環境交易可以訂閱,並且可以繼續並提交。使用TransactionScope集成測試時,web apis

我遇到過一些關於如何在一個線程上打開一個TransactionScope,然後創建一個依賴事務通過閉包傳遞給一個新任務的帖子,但我不知道如何將它應用到一個HttpClient連接到內存中的HttpServer。我嫌疑人我只是沒有正確的想法,但這是關於我必須繼續。

什麼會使感覺/工作/等?我完全控制了將連接到它的HttpServer和HttpClient的創建,但我不知道如何處理它們。

UPDATE:

取得了一些進展作出─我寫如果填充 Transaction.Current可以創建工作線程依賴交易時,得到有一個消息處理程序,併爲我的一些電話它是,但對於其他人來說,它並不是,我想知道我是否會追逐陰影 - 就像有很多ContinueWith一樣,而且我認爲它是在調用線程上執行的(這當然會有一個事務)if先行任務已經完成。

是否有可能只是同步運行整個事情並將測試線程一直貫穿?我試驗了一些與ContinueWith同步但沒有太大的成功..

回答

0

事實證明,HttpClient和HttpServer 不是旋轉後臺線程 - 相反,我的代碼中有一些錯誤的Task.StartNew在導致問題。除去那些讓我走了。

0

如果你沒有死的使用真正的HTTP連接,你可以通過代碼(通過使用程序集引用)直接調用接口一個測試框架,允許您執行每個會話或每個測試的啓動和關閉工作(例如MSTest的類和測試初始化​​函數)。在這種情況下,您可以打開一個在成員變量中通過類共享的TransactionScope,並將其置於類或測試關閉功能中。因爲您沒有調用.Commit(),它將回滾事務期間發生的操作。

+0

那麼,這就是我們目前測試控制器的方法,但是我們的想法是測試一個C#庫之間的交互,該C#庫將Web通信與Web API進行了抽象,這需要使用真正的HTTP連接。 另一方面,我想我找到了我的答案--HttpServer對象似乎並沒有在Async調用上啓動一個線程,但我的客戶端代碼完全不必要地完成了。我把那些東西拿出來,它工作正常。 –