• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

assert_equal

VPS Starter Arubacloud
+1 głos
285 wizyt
pytanie zadane 19 sierpnia 2016 w Ruby przez Szalbik Początkujący (430 p.)
Przerabiam książke "Agile Rails 5", jest w niej coś takiego jak assert_equal, z tego co wyczytałem to ta metoda sprawia, że porównuje się 2 wartości i jeżeli jest false to trzecia wartość [msg] jest wyświetlana w testach. Ale co robi poniższy kod. Proszę o dokładną odpowiedź jestem nowy w Ruby.
 

test 'products is not valid without unique title' do
    product = Product.new(title: products(:ruby).title,
                          description: "aaaaaaa",
                          price: 1,
                          image_url: "fred.gif")
    
    assert product.invalid?
    assert_equal ["has already been taken"], products.errors[:title]
  end

1 odpowiedź

+1 głos
odpowiedź 19 sierpnia 2016 przez dikons Użytkownik (540 p.)
wybrane 19 sierpnia 2016 przez Szalbik
 
Najlepsza

No więc od początku:

test 'products is not valid without unique title' do

Zaczynamy test, który ma sprawdzić, że każdy produkt ma mieć swój unikalny tytuł. Wydaje mi się, że zamiast "products", powinno być "product". To tylko nazwa testu, ale "products" może być mylące.

 

product = Product.new(title: products(:ruby).title,
                          description: "aaaaaaa",
                          price: 1,
                          image_url: "fred.gif")

Na potrzeby testu tworzymy sobie nowy produkt według modelu z app/models/product.rb. Sprawdzamy unikalność title, więc jako title właśnie przyjmujemy tytuł który jest już w bazie danych. W testach używamy do tego pliku test/fixtures/products.yml, w którym dodajemy sobie produkty, który chcemy umieścić w testowej bazie danych. Używamy ich potem np. tak: 

products(:ruby)

co odpowiada takiemu rekordowi w test/fixtures/products.yml :

ruby:
    title: "Jakistytul"
    description: "leelelel"
    price: 13
    image_url: "lol.gif"

Więcej o fixtures tutaj: http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures

 

 

assert product.invalid?

Mamy dwa produkty o takim samym title. Jeden siedzi w bazie, drugi właśnie stworzyliśmy. Teraz chcemy zapewnić, że nasz lokalny product nie nadaje się do dodadania do bazy, więc product.invalid? powinno zwrócić true.

 

 assert_equal ["has already been taken"], products.errors[:title]

Upewniliśmy się, że produkt nie nadaje się do bazy, teraz chcemy upewnić się, że powodem był zajęty title. Tutaj chyba wkradł się mały błąd, zamiast "products.errors[:title]" powinno być "product.error[:title]". "products" odnosi się do całej bazy danych, a nam chodzi o błąd naszego testowego produktu. assert_equal przechodzi test kiedy dwa podane argumenty są identyczne. product.errors[:title] zwraca nam tablicę z wiadomościami o błędach dotyczących :title, dlatego porównujemy to z ["has already been taken"] - taką właśnie wiadomość błędu powinniśmy otrzymać. Więcej tutaj: http://guides.rubyonrails.org/active_record_validations.html#validations-overview-errors

BTW. Jeśli w product.errors[:title] znajdowałyby się jakieś inne błędy, test by nie przeszedł. Żeby tego uniknąć możnaby zamiast assert_equal napisać np:

assert product.errors[:title].include?("has already been taken")

 

 

Oczywiście, że cały ten test przeszedł w modelu produktu musi znaleźć się taki kod:

class Product < ApplicationRecord
  .
  .
  .
  validates :title, uniqueness: true
  .
  .
  .
end

 

Podobne pytania

0 głosów
1 odpowiedź 127 wizyt
pytanie zadane 24 lipca 2021 w Ruby przez ::{}:: Gaduła (3,890 p.)
0 głosów
0 odpowiedzi 178 wizyt
pytanie zadane 9 listopada 2019 w Ruby przez reaktywny Nałogowiec (40,650 p.)
0 głosów
1 odpowiedź 303 wizyt
pytanie zadane 4 stycznia 2018 w Ruby przez Scypyon Gaduła (3,450 p.)

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...