2012-12-15 46 views
7

我不確定如何使用功能測試來檢查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,「閃光燈是每個請求清除會話的一個特殊部分

反正是有在重定向之後測試閃存消息是否正確顯示的方法?

+0

我有同樣的問題。我發現,當我通過get調用的動作重定向它似乎工作,即assert_select可以訪問重定向的視圖,但是當我從'post'調用的動作重定向時,它只會看到'您正在重定向...'頁。很煩人。我試圖使用follow_redirect!但這在功能測試中不可用。 –

回答

3

我從POV回答這個問題,你試圖測試的其他地方會更好地測試。如果您遇到了很大的麻煩設置測試,賠率是有一個更好的方法來測試它:)

  1. 測試的那一剎那的消息得到清除 - 閃的消息中內置了Rails的,所以它不」對於測試框架爲您處理的內容而言,這非常有意義。

  2. 測試頁面上顯示的元素 - 查看規範不屬於控制器。以下是對控制器角色的描述:

    控制器因此可以被認爲是模型和 視圖之間的中間人。它使模型數據可用於視圖,以便它可以向用戶顯示 數據。

    控制器應該讓數據可用於視圖,而不是指定數據如何呈現。試想一下,如果您更改了CSS類的名稱,那麼您還必須更新控制器規格。

    如果您確實想測試顯示的Flash消息,我會使用集成測試。

相關問題