Nie wiem, jak sprawdzić wiadomości flash za pomocą testów funkcjonalnych. Mój problem ma coś wspólnego z redirect_to
, ponieważ mój test na flash[:error]
przechodzi. Oto co mój create
działania wygląda następująco:Testy funkcjonalne wiadomości flash po przekierowaniu
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
Mam testu Dopuszczenie flash[:error]
że 1) sprawdza, czy flash[:error]
jest prawidłowa wartość, 2) sprawdza stronę dla div flash i 3) trafia nowa stronę i sprawdza, czy wiadomość flash została wyczyszczona. Próbowałem wykonać analogiczny test dla flash[:success]
, ale kończy się niepowodzeniem, gdy próbuje znaleźć element div na stronie. Oto test braku:
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
Kiedy przetestować ręcznie w przeglądarce, to zachowuje się zgodnie z oczekiwaniami, ale nie jestem pewien, jak pisać testy w celu odzwierciedlenia tego. Pierwsze dwie asercje są przekazywane (więc test rozpoznaje, że jest poprawnie przekierowywany i że flash[:success]
jest ustawiony na "Welcome!"
). Opierając się na tym, że myślę, że oświadczenie assert_select
byłby w stanie znaleźć div, ale jeśli nie powiedzie się z tym komunikatem o błędzie:
Expected at least 1 element matching "div.alert-success", found 0.
więc próbowałem dodając puts @response.body
tuż przed oświadczeniem assert_select
, który drukowanej to:
<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>
To wyjaśnia, dlaczego nie można znaleźć elementu flash div, ale nie jestem pewien, jak "zakończyć" przekierowanie, aby renderował poprawny widok za pomocą elementu div flash. Jeśli dodam instrukcję get
tuż przed instrukcją assert_select
, test przechodzi, ponieważ teraz @response.body
ma flash div. Nie wydaje się to jednak skutecznym testem, ponieważ nie odzwierciedla zachowania mojej aplikacji - użytkownik nie musi wysyłać nowych żądań, aby zobaczyć wiadomość flash.
Nie gwarantuje również, że wiadomość flash pojawi się na właściwej stronie. Jeśli użyję oświadczenia get :new
, asercja nadal przechodzi, co oznacza, że wiadomość flash będzie obecna w widoku users#new
. Nawet jeśli używam
get :show, id: assigns(:user).id
aby upewnić się, że wiadomość błysk pojawia się na właściwej stronie, to nadal czuje się źle, ponieważ 1) teraz jest success
odpowiedź zamiast odpowiedzi redirect
i 2) to nadal robi” t wyjaśnić, dlaczego muszę ręcznie zażądać dowolnej stronie, aby znaleźć div błyskowej - według docs „lampa błyskowa jest specjalną częścią sesji, która jest usunięte z każdego żądania”
w każdym razie, jest tam sposób na sprawdzenie, czy po przekierowaniu wiadomość flash wyświetla się poprawnie?
Mam ten sam problem. Zauważyłem, że kiedy przekierowuję z akcji wywoływanej przez get, to działa, tzn. Assert_select ma dostęp do przekierowanego widoku, ale kiedy przekierowuję z akcji wywołanej przez "post", widzi tylko "Jesteś przekierowywany ..." strona. Bardzo irytujące. Próbowałem użyć follow_redirect! ale nie jest to możliwe w testach funkcjonalnych. –