簡體   English   中英

Rails:使用RSpec測試授權(Pundit)

[英]Rails: Testing authorization (Pundit) with RSpec

我想用RSpec徹底測試Rails應用程序授權設置(Pundit)。

  1. Pundit文檔其他尊重的消息來源建議為Pundit策略類編寫單元測試。 這些測試是測試行為(好)還是實現細節(壞)?

  2. 如果我們實際測試行為,如果我們最終從Pundit切換到另一個授權gem或者我們自己的授權,我們的測試是否仍然不能通過?

  3. 假設從控制器操作中意外刪除了對authorize方法的調用,使其打開以供公共訪問。 Pundit政策測試將繼續通過。 如果我們沒有其他測試,我們的測試套件可能都是綠色的,而我們的應用程序有嚴重的安全漏洞。 我們怎能避免這種情況? 也許為Pundit控制器類編寫單元測試,為控制器分別進行單元測試,並在控制器測試中模擬authorize方法以確保它們被調用?

編輯:第二個想法,我對實現細節和類的公共API之間的差異有一個判斷失誤。 調用特定的公共方法,傳遞特定的參數並期望特定的返回值是單元測試(和使用)任何類的要求。 因為我的原始論點無效,請忽略第3項。

  1. 我們可以編寫控制器或請求以不同用戶角色登錄的規范,調用控制器操作並斷言訪問是被授予還是被拒絕,而不是測試Pundit策略類。 在這種方法中,即使我們切換到另一個授權gem,測試也會繼續通過。 此外,如果未調用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM