2015-02-09 19 views
19

Chciałbym przetestować User modele stowarzyszenie has_many :projects, dependent: :destroy i poszły tak daleko teraz:Jak testować zależnie:: niszczyć przy pomocy RSpec?

it "destroys dependent projects" do 
    user = FactoryGirl.build(:user) 
    project = FactoryGirl.build(:project) 

    user.projects << project 
    user.destroy 

    expect(Project.count).to change(-1) 
end 

ale to daje się błąd:

Failure/Error: expect(Project.count).to change(-1) 
    ArgumentError: 
     `change` requires either an object and message (`change(obj, :msg)`) or a block (`change { }`). You passed an object but no message. 

więc przypuszczać, że nie jest change właściwy matcher, prawda? Czy możesz mi powiedzieć, jak mógłbym napisać ten test bez otrzymania tego błędu?

Odpowiedz

24

To prawo dopasowujący, ale nie jest używany prawidłowy sposób:

  • oczekiwać potrzeby, aby otrzymać blok zawierający działania w celu przeprowadzenia (w twoim przypadku usunięcie użytkownika)
  • zmiana musi odebrać blok, który generuje wartość liczbową, która ma ulec zmianie (może również otrzymać obiekt i symbol wskazujący, że rspec powinien wywołać nazwaną metodę)

Prawidłowy sposób jest

expect { user.destroy }.to change { Project.count } 

To tylko potwierdza, że ​​zmiany wartości liczbowe, ale nie określa, o ile. Aby to zrobić, łańcuch połączenia do by:

expect { user.destroy }.to change { Project.count }.by(-1) 
2

To powinno działać:

expect { user.destroy }.to change { Project.count }.by(-1) 
3

Należy przetestować do usuwania rzeczywistego projektu.

expect(Project.all).not_to include project 
23

Można również użyć shoulda dopasowujące:

it { expect(user).to have_many(:projects).dependent(:destroy) } 

https://github.com/thoughtbot/shoulda-matchers

+1

to pokazuje błąd jako metody niezdefiniowanej zależnej .. – indb

+0

powinien zawierać dopasowujących shoulda w spec_helper: 'require„powinieneś/dopasowujących '', więcej informacji na temat zależności: https://github.com/thoughtbot/shoulda-matchers/blob/master/lib/shoulda/matchers/active_record/association_matcher.rb#L147-L182 – santuxus

+0

Czy istnieje jakieś inne rozwiązanie zamiast używania shoulda -mątrzy gem? – indb

Powiązane problemy