我不確定如何使用功能測試來檢查Flash消息。我的問題與redirect_to
有關,因爲我的測試flash[:error]
通過。這裏是我的create
動作是什麼樣子:重定向後的Flash消息功能測試
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user, flash: { success: "Welcome!" }
else
flash.now[:error] = "Signup failed:"
render 'new'
end
end
我有flash[:error]
路過的測試1)檢查flash[:error]
是正確的值,2)檢查閃光燈DIV的頁面,以及3)獲得一個新的頁面,並檢查該消息是否已被清除。我試圖爲flash[:success]
做一個類似的測試,但它試圖在頁面上找到div時失敗。下面是失敗的測試:
should "show flash[:success] message" do
post :create, user: { name: "valid user",
password: "userpw",
password_confirmation: "userpw",
email: "[email protected]" }
assert_redirected_to user_path(assigns(:user)), "user isn't being redirected to their page after registration"
assert_equal flash[:success], "Welcome!", "flash[:success] isn't being set properly"
assert_select "div.alert-success", flash[:success]
get :new
assert flash.empty?, "there shouldn't be any flash messages left after getting new page"
end
當我在瀏覽器中手動測試,它的行爲預期,但我不知道如何編寫測試來反映這一點。前兩個斷言是通過的(所以測試認識到它正在被正確重定向,並且flash[:success]
被設置爲"Welcome!"
)。在此基礎上,我會認爲assert_select
聲明將能夠找到格,但如果失敗,出現此錯誤消息:
Expected at least 1 element matching "div.alert-success", found 0.
所以assert_select
語句,它打印在此之前對的,我嘗試添加puts @response.body
:
<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>
這解釋了爲什麼它找不到Flash div,但我不知道如何「完成」重定向,以便它使用Flash div呈現正確的視圖。如果我在assert_select
聲明之前添加get
聲明,則測試通過,因爲現在@response.body
具有閃存分區。但是,這看起來並不像一個有效的測試,因爲它不反映我的應用程序的行爲 - 用戶不必提出新的請求來查看Flash消息。
它也不保證在正確的頁面上顯示Flash消息。如果我使用語句get :new
,斷言仍然通過,這意味着閃存消息將出現在users#new
視圖中。即使我用
get :show, id: assigns(:user).id
,以確保閃光燈消息顯示了正確的頁面上,這仍覺得錯的,因爲1)現在是一個success
響應,而不是一個redirect
反應,和2)它仍然沒有按」牛逼解釋爲什麼我必須手動請求的任何頁面找到閃光的div - 根據docs,「閃光燈是每個請求清除會話的一個特殊部分」
反正是有在重定向之後測試閃存消息是否正確顯示的方法?
我有同樣的問題。我發現,當我通過get調用的動作重定向它似乎工作,即assert_select可以訪問重定向的視圖,但是當我從'post'調用的動作重定向時,它只會看到'您正在重定向...'頁。很煩人。我試圖使用follow_redirect!但這在功能測試中不可用。 –