2013-06-26 10 views
7

Rozumiem różnicę między imperative and declarative cucumber steps, ale nie widziałem żadnych rzeczywistych przykładów tego świata. Zawsze mam wrażenie, że moje pliki funkcji stają się zbyt szczegółowe.Jak pisać deklaratywne funkcje Ogórek do opisywania operacji CRUD?

Wydaje się, że musiałyby być cechą ogórek na każdym etapie cyklu życia:

  • foobars/list_foobars.feature
  • foobars/create_foobar.feature
  • foobars/view_foobar.feature
  • foobars/edit_foobar.feature
  • foobars/delete_foobar.feature

W samej tylko funkcji tworzenia, wydaje się, że chcesz wypisać listę pól, które można wprowadzić, które są wymagane, co dzieje się po wprowadzeniu nieprawidłowych danych, itp. Nie znam deklaratywnego sposobu wykonania to. Oczywiście w kolejnych funkcjach wystarczy powiedzieć: Given a foobar exists, a nie przechodzić przez wszystkie etapy tworzenia.

Na ile szczegółowo opisujesz zachowanie aplikacji? Czy możesz podać kilka przykładów plików funkcji, które Twoim zdaniem są dostatecznie kompletne?

Odpowiedz

4

lubię trzymać testy ogórka czytelny dla człowieka, więc zakładając, że mamy jakąś historię do edycji foobar z nieprawidłowymi danymi, chciałbym scenariusz jak:

# foobars/edit_foobar.feature 
Feature: As a user, I want to edit a Foobar, so I can Baz 

Scenario: Validation Errors 
    Given I am logged in as a user 
    And a foobar exists 
    And I edit the foobar with invalid data 
    Then I should see validation errors 

myślę, że oddaje to, co chcemy się historii, bez konieczności zajmowania się wszystkimi szczegółami pól do edycji, przycisków do przesłania itd. Nie testuje wszystkich możliwych przypadków, ale te powinny być naprawdę testowane za pomocą testów jednostkowych (testy modelu, które sprawdzają poprawność są ustawione, a kontroler sprawdza, czy wiadomości flash są ustawione, lub prosi o sprawdzenie, czy błędy są wyświetlane).

Pozostałe scenariusze są podobne:

Scenario: Successful Edit 
    Given I am logged in as a user 
    And a foobar exists 
    And I edit the foobar with valid data 
    Then I should see the valid data 

Niektórzy ludzie będą chcieli podać poprawne dane jako część samego testu, ale ja osobiście wolę przekazać je do definicji krok w celu utrzymania scenariusze czysty. Wystarczy jeden przykład, aby upewnić się, że złoty przypadek działa, ponieważ znowu nie jest to odpowiednie miejsce do sprawdzenia, czy wszystkie pola formularza działają (i stanie się to ból głowy konserwacji, jeśli określisz każde pole).

+0

interesujący, dzięki! Pytanie uzupełniające: czy używasz funkcji ogórka do komunikowania logiki biznesowej? Dzięki jednemu krokowi zwanemu poprawnymi lub nieprawidłowymi danymi, wydaje się, że ukrywa ono zachowanie, które może być ważną logiką biznesową. Na przykład logika biznesowa może określić, które pola są wymagane, więc krok "Wypełnij wymagane pola" może nie komunikować się wystarczająco. Myśli? – Andrew

+2

W niektórych przypadkach (np. W celu zachowania zgodności z obowiązującymi przepisami) istnieją uzasadnione powody biznesowe, by wymagać określonej dziedziny, ale często zdarza się, że gdy ktoś chce, aby to pole było przechowywane, istnieje inna historia (np. Chęć wysłania materiałów marketingowych za pośrednictwem poczty elektronicznej lub chcesz, aby użytkownicy mogli się logować przez e-mail). W tym ostatnim przypadku wymagane pole jest szczegółem implementacji, dlatego należy je przetestować w jednostce. W pierwszym przypadku możesz napisać test imperatywny, aby był konkretny, szczególnie jeśli używasz testów ogórka do komunikacji z właścicielem produktu. –

+0

To nie odpowiada na pytanie. –

-1

Myślę, że może nie przetestować tego w ogóle za pomocą Ogórka, zamiast tego po prostu skomentuj w sekcji Cecha.

Alternatywnie może można zrobić coś takiego:

# categories.feature 

Scenario: Manage categories 
    Given I want to manage categories 
    When I <crud_type> a category 
    Then I should be taken to the listing page 

    Examples: 
     | crud_type | 
     | create | 
     | edit  | 
     | delete | 

Scenario: View category 
    Given I want to view a particular category 
    When I click on a category in the category list 
    Then I should see that category's view page 
+0

Czy chcesz wyjaśnić sprawę? –