2012-04-03 45 views
0

我正在測試使用SqlAlchemy(v0.7.4)的消息處理器。在我的測試中,我使用Fixture (v1.4)和Sqlite來設置和拆除一個臨時數據庫。我的夾具數據包括一個文件表,其中包含狀態字段,應在處理器運行時更​​新。當我在單元測試中使用SqlAlchemy的Fixture時,爲什麼我無法在測試期間確認數據庫的更改?

我已確認測試,正在測試的處理器和燈具都共享相同的數據庫會話。

我在處理器運行之前和之後查詢文件記錄上的狀態字段。值應該改變(從表示「Processing」的int到「Complete」)。我在處理器中添加了調試代碼,以驗證該字段是否正在使用正確的新狀態值進行更新。我還能夠通過檢查它生成的輸出文件的內容來獨立驗證處理器是否成功運行。但是,當我使用測試的數據庫會話查詢測試結束時的狀態時,它始終與開始時的值相同。

我已經試過在最終狀態查詢之前顯式提交和刷新會話。什麼都沒有有任何想法嗎?

+0

我發現了這個問題。正在測試的腳本正在分叉發生數據庫更新的新子進程。 Sqlite數據庫正在內存中設置,因此測試數據庫會話和處理器的會話位於不同的內存空間中。解決方法是設置臨時Sqlite數據庫的文件而不是內存。 – klenwell 2012-04-03 22:54:44

+0

同上。如果內存存儲是可能的話會更好。測試應該以這種方式快速運行。 – jpanganiban 2012-08-20 15:05:26

回答

2

這裏的問題是雙重的:1)我的測試是在內存中使用臨時Sqlite數據庫。 2)在我的功能測試中,處理器正在一個新的過程中產生。

因此,儘管我已經破解了處理器類以使用與測試本身相同的數據庫會話,但由於處理器和數據庫位於單獨的內存空間中,因此數據庫更新處理器使試圖驗證的測試代碼不可見結果。

解決方案:設置臨時Sqlite數據庫in-file rather than in-memory

此外,我發現,當Fixture進行拆卸時,如果您的夾具數據與安裝位置不同(在this section末尾註明),它將引發錯誤。但那是一個單獨的問題。

相關問題