[英]Rails: Testing authorization (Pundit) with RSpec
我想用RSpec徹底測試Rails應用程序授權設置(Pundit)。
Pundit文檔和其他尊重的消息來源建議為Pundit策略類編寫單元測試。 這些測試是測試行為(好)還是實現細節(壞)?
如果我們實際測試行為,如果我們最終從Pundit切換到另一個授權gem或者我們自己的授權,我們的測試是否仍然不能通過?
假設從控制器操作中意外刪除了對authorize
方法的調用,使其打開以供公共訪問。 Pundit政策測試將繼續通過。 如果我們沒有其他測試,我們的測試套件可能都是綠色的,而我們的應用程序有嚴重的安全漏洞。 我們怎能避免這種情況? 也許為Pundit控制器類編寫單元測試,為控制器分別進行單元測試,並在控制器測試中模擬authorize
方法以確保它們被調用?
編輯:第二個想法,我對實現細節和類的公共API之間的差異有一個判斷失誤。 調用特定的公共方法,傳遞特定的參數並期望特定的返回值是單元測試(和使用)任何類的要求。 因為我的原始論點無效,請忽略第3項。
authorize
方法,它們將失敗。 但是,這些將是集成測試,並且應該比單元測試Pundit策略類更慢。 這可能是測試授權設置的更好方法嗎? 提前致謝。
1)Pundit文檔和其他尊重的來源)建議為Pundit策略類編寫單元測試。 這些測試是測試行為(好)還是實現細節(壞)?
一個好的策略規范是測試系統組件的行為。 並非所有不對整個系統進行測試的規范都是邪惡的。 它更傾向於測試它的作用 - 而不是它是如何做到的 。
您可以將其與測試服務對象或任何其他組件進行比較。
我發現策略規范是一種非常簡潔和准確的方法來測試授權行為,而無需額外的抽象層(HTTP,應用程序狀態......)。 這很像模型規范如何更好地測試驗證邊緣情況而不是沿着Capybara拖動。
2)如果我們實際測試行為,如果我們最終從Pundit切換到另一個授權gem或推出我們自己的授權,我們的測試是否仍然無法通過?
是的 - 但這幾乎可以為系統中的任何組件辯護。 您的更高級別規范(請求和功能)仍應通過(這也涵蓋控制器正確集成Pundit)。
3)假設從控制器動作中意外地刪除了對授權方法的調用,使其打開以供公共訪問。 Pundit政策測試將繼續通過。 如果我們沒有其他測試,我們的測試套件可能都是綠色的,而我們的應用程序有嚴重的安全漏洞。 我們怎能避免這種情況? 也許為Pundit控制器類編寫單元測試,為控制器分別進行單元測試,並在控制器測試中模擬授權方法以確保它們被調用?
控制器測試在Rails 5中被刪除 。 使用請求或功能規格而不是窺探內部。
您應該具有請求/功能規范,以確保用戶無法執行他們無權執行的操作。 例如,在API的請求規范中,您將檢查響應代碼是否為Unauthorised (401)
。 如果你是偏執狂,你也可以檢查是否沒有改變。
對於功能規范,您測試用戶是否被重定向或通知他們無法執行操作。
再次測試它的作用 - 而不是它是如何做到的 。
由於這是非常重復的,您可以使用共享示例來干掉它。
4)我們可以編寫控制器或請求以不同用戶角色登錄的規范,調用控制器操作並斷言訪問是被授予還是被拒絕,而不是測試Pundit策略類。 在這種方法中,即使我們切換到另一個授權gem,測試也會繼續通過。 此外,如果未調用授權方法,它們將失敗。 但是,這些將是集成測試,並且應該比單元測試Pundit策略類更慢。 這可能是測試授權設置的更好方法嗎?
這里的選擇再次不是二元的。 兩種類型的測試都提供了價值。 您可以通過單獨的集成測試獲得,但是它可以很難和很慢地覆蓋每個可能的情況和邊緣情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.