2010-11-09 20 views
8

Chcę uruchomić test, który testuje kolejność elementów Chcę, aby kolejność rosła według daty.Kolejność testu ogórek elementów w tabeli

Oto mój scenariusz funkcji ogórka i krok do ostatniego zdania.

Scenario: Order of the events should be Ascending 
    Given I am signed into an account called "Gorilla Tech" as a customer 
    When I follow "Register" 
    And I follow "Events" 
    And I follow "Register new event" 
    Then I should see the header "Use the form below to register a new event" 
    And I fill in "Title" with "Apefest 2010" 
    And I fill in "Event at" with "2010-01-07" 
    And I fill in "Add a note" with "This was truly awesome" 
    Then I press "Create" 
    Then I follow "Register new event" 
    And I fill in "Title" with "Monkeyfest 2010" 
    And I fill in "Event at" with "2010-01-08" 
    And I fill in "Add a note" with "Yeah" 
    Then "Apefest 2010" should appear before "Monkeyfest 2010" 



    Then /"(.*)" should appear before "(.*)"/ do |first_example, second_example| 
    response.body.should =~ /#{first_example}.*#{second_example}/ 
    end 

Naprawdę mam tu dwa problemy. Pierwszym z nich jest to, w jaki sposób poprawnie określić mój test? Czy mogę określić mój test powyżej różnych i bardziej poprawnych?

Co chcę zrobić, to zarejestrować 2 różne wydarzenia w 2 różnych datach. Wydarzenie pojawi się później jako lista na stronie. Następnie chcę sprawdzić, czy wydarzenia są uporządkowane według daty. Chcę, aby wydarzenie z najnowszą datą pojawiło się na górze.

tutaj jest kod z kolekcji, którą chcę przetestować. W pewnym sensie chcę sprawdzić, czy kolekcja w div poniżej ma rosnącą kolejność według daty.

<div id="feeds"> 
    <table> 
     <caption><%= t('events.all') %></caption> 
     <thead> 
     <tr> 
      <th><%= Event.t(:title) %></th> 
      <th><%= Event.t(:event_at) %></th> 
      <th></th> 
     </tr> 
     </thead> 
     <tbody> 
     <%= render :partial => 'event', :collection => @events %> 
     </tbody> 
    </table> 
    </div> 

    <%= will_paginate(@events) %> 
+0

Musimy bardziej wyjaśnić o prawdziwym pytaniem – shingara

+1

zgodzić się z @shingara, co to chciałbyś wiedzieć? Twój scenariusz jest zbyt długotrwały. Prawdopodobnie powinieneś zmienić ten test, ponieważ testujesz wiele różnych rzeczy w jednym scenariuszu. –

+0

Kiedy rejestruję zdarzenia, więc rejestruję 2 zdarzenia z 2 różnymi event_at. Później chcę sprawdzić, czy moje wydarzenia rejestracyjne zostały zamówione z najnowszym wydarzeniem na górze. To właśnie próbuję porównać ze stołem. Problem polega na tym, że test sprawdza tylko, czy konto ma wydarzenie, a nie kolejność, w jakiej znajduje się wydarzenie. Jestem zupełnie nowy w testach na ogórki, więc naprawdę nie znam dobrego sposobu na określenie moich testów. –

Odpowiedz

13

Sposób, w jaki napisałeś definicję kroku jest w porządku, wystarczy dodać przełącznik multilinii (m) do swojego wzorca. :)

response.body.should =~ /#{first_item}.*#{second_item}/m 
+0

Powoduje to błąd: niezdefiniowana metoda 'body 'dla zero: NilClass (NoMethodError): S –

+3

Używasz kapibary lub webrata za Cucumber? Jeśli kapibara użyjesz "strony" zamiast "odpowiedzi" i możesz, ale nie musi, zadzwonić do tej metody. Jeśli webrat to powinno działać, chyba że jeszcze nie odwiedziłeś strony. –

+2

page.body.should jest tym, czego potrzebujesz do kapibara. – Clinton

4

bym może zaproponować jakąś konsolidację do swoich krokach za pomocą tabeli.

Scenario: Order of the events should be Ascending 
... 
And I fill in "Title" with "Apefest 2010" 
And I fill in "Event at" with "2010-01-07" 
And I fill in "Add a note" with "This was truly awesome" 
Then I press create 

Proponuję:

Scenario: Order of the events should be Ascending 
... 
When I register a new event: 
| Title | Event at | Add a note | 
| Apefest 2010 | 2010-01-07 | This was truly awesome | 

Twoje obecne rozwiązanie jest handel off nie jest bardzo precyzyjna, patrząc w całym organizmie reakcji można znaleźć tekst z jednego przykład w innym miejscu. Sugerowałbym użycie XPATH do twojego progu bólu albo używającego, zakładam, że używasz Watir (albo wariant), klasy.

Można by zebrać wszystkie nazwy zdarzeń z tabeli przez iteracja ciągu wierszy (i określając kolumnę, która zawiera nazwę zdarzenia, tutaj zakładam pierwszy) ...

event_names = $browser.div(:id,"feeds").tables.first.rows.collect {|row| row[0].text} 

Następnie twierdzą, że zdarzenia istnieją i są w pożądanej kolejności w obrębie tablicy.

event_names.index(first_example).should_not be_nil 
event_names.index(second_example).should_not be_nil 
event_names.index(first_example).should < event_names.index(second_example) 
+1

Jak mogę stwierdzić, że zdarzenia są w pożądanej kolejności w obrębie tablicy? –

+0

Dodano asercje, aby upewnić się, że znajdują się w tablicy i że są poprawnie uporządkowane. – burtlo

0

Dlaczego po prostu nie użyć selektora n-dziecko?

page.should have_selector('tbody tr:nth-child(1)', text: first_example) 
page.should have_selector('tbody tr:nth-child(2)', text: second_example) 
Powiązane problemy