2010-12-13 8 views
6

Mam model użytkownikatestowania: reject_if w ANAF

class User < ActiveRecord::Base 
    has_many :languages, :dependent => :destroy 
    accepts_nested_attributes_for :languages, :reject_if => lambda { |l| l[:name].blank? } 
end 

Chcę przetestować reject_if część z RSpec 2.0.0. Obecnie mam dwa proste przypadki testowe dla tego:

it "should not save language without name by accepts_nested_attributes" do 
    lambda { 
     @user.update_attributes!("languages_attributes"=>{"0"=>{}}) 
    }.should_not change(Language, :count) 
    end 

    it "should save language with name by accepts_nested_attributes" do 
    lambda { 
     @user.update_attributes!("languages_attributes"=>{"0"=>{"name"=>"lang_name"}}) 
    }.should change(Language, :count).by(1) 
    end 

Jednak jestem całkiem nowy w testowaniu i wygląda naprawdę dziwnie imho. Zastanawiam się, czy jest to właściwy sposób na test reject_if? Czy istnieje lepszy sposób na zrobienie tego?

Odpowiedz

10

widzę, że szukasz przetestować reject_if to najlepszym sposobem na to jest, aby przetestować go bezpośrednio:

anaf_for_languages = User.nested_attributes_options[:languages] 
anaf_for_languages[:reject_if].call({ "name" => "" }).should be_true 

Jeśli to true, następnie name jest pusty. Myślę, że jest to trochę bardziej zwięzłe niż twój kod, ale nie tak oczywiste.

+0

Twoje podejście jest jasne i przejąłem go. Twój przykład nie zależy od widoku i formy i brzmi dobrze => więcej izolacji. Jednak nie jestem pewien, czy jest to właściwy sposób, ponieważ moim zamiarem jest sprawdzenie, czy rekord języka nie jest zapisywany, gdy użytkownik przesyła formularz z pustym polem nazwy języka. Może to jest kolejne pytanie, ale jaka jest dobra strategia do naśladowania, gdy testujesz jednostkę - izolujesz się od wszystkiego tak bardzo, jak to możliwe, lub próbujesz symulować rzeczywisty przepływ pracy aplikacji? jeśli odpowiedź jest drugą opcją, czy mój przykład jest prawidłowy i prawidłowy? –

+0

@Tadas: W pierwotnym pytaniu nie było nic na temat widoku ani formularza, więc odpowiedziałem najlepiej jak potrafię pod tym względem. Jeśli chcesz przetestować ten widok/formularz, polecam pójść z czymś takim jak ogórek lub stek do testów integracji na pełnym stosie. –