目錄
錯誤展示
代碼展示
產生原因
每次僅使用一個session,commit會將session內所有對象進行提交併刪除,則後續session內無對象,需要手動add。
每次調用
db.session
它都會將調用傳遞給綁定到當前作用域(由其定義scopefunc
)的會話。默認情況下,Flask-SQLAlchemy定義scopefunc
返回當前線程的標識。正常生產:
- 每個線程中一次只處理一個請求;
- 會話
db.session
在第一次調用時打開;- Flask-SQLAlchemy在請求後關閉會話(完全在應用程序拆解時)。
假設該應用程序在每個請求期間使用單獨的會話。會話在開始時打開,在請求結束時關閉。
在當前測試的實現中:
- 每個請求都在同一個線程中處理,因此使用相同的SQLAlchemy會話;
- 第一次打開的會話被
db.session
調用,並且在測試加載燈具時發生;- Flask-SQLAlchemy在應用程序拆解時關閉會話。它只發生在
tearDown
方法中 - 當最後一個上下文離開應用程序上下文的堆棧時。因此,情況非常不同:使用相同的SQLAlchemy會話來處理測試期間發出的所有請求。這與生產中的工作方式有很大的不同,消除它會很好。
Flask-WebTest提供了輕鬆管理SQLAlchemy範圍的方法:
SQLAlchemyScope
您可以進入和退出以及scopefunc
在測試期間必須使用的自定義。
解決方式