2012-12-15 21 views
7

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?

+0

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. –

Odpowiedz

3

Odpowiadam na to pytanie z POV, że to, co próbujesz przetestować, będzie lepiej przetestowane w innym miejscu. Jeśli masz wiele kłopotów konfigurowania test, kursy są tam lepszy sposób, aby przetestować jej :)

  1. Testing że Flash Komunikaty się zdaje - Wiadomości Flash są wbudowane w Rails, więc nie robi” • Spraw, aby przetestować coś, co framework dla ciebie obsługuje.

  2. Testowanie elementów na stronie - specyfikacje widoku nie należą do kontrolerów.Oto opis roli kontrolera:

    Sterownik można zatem uznać za pośrednika między modelami a widokami . Dzięki temu dane modelu są dostępne dla widoku, dzięki czemu mogą wyświetlać dane użytkownikowi.

    Kontroler ma udostępniać dane w widoku, a nie określić sposób renderowania danych. Wyobraź sobie, że jeśli zmienisz nazwę swojej klasy CSS, musisz również zaktualizować specyfikacje kontrolera.

    Jeśli naprawdę chcesz przetestować pokazywanie wiadomości flash, chciałbym użyć testu integracji.

Powiązane problemy