2016-01-23 15 views
7

Uważam, że metoda .and jest bardzo przydatna do łączenia wielu oczekiwań.RSpec: Czy nie ma dla `i zmiany`, np. `and_not to change`?

expect { 
    click_button 'Update Boilerplate' 
    @boilerplate_original.reload 
} .to change { @boilerplate_original.title }.to('A new boilerplate') 
    .and change { @boilerplate_original.intro }.to('Some nice introduction') 

Czy istnieje coś, co pozwala mi sprawdzić bez zmian?

.and_not change { @boilerplate_original.intro } 

Coś takiego? Nie mogłem znaleźć niczego i trudno jest wyszukać w Google coś takiego "i nie".

Odpowiedz

11

Nie, nie ma and_not a nie ogólnie operator negacji, jak to omówiono w https://github.com/rspec/rspec-expectations/issues/493

Istnieje jednak mechanizm definiowania zanegowane wersję istniejącego dopasowującego, jak opisano w http://www.rubydoc.info/github/rspec/rspec-expectations/RSpec/Matchers.define_negated_matcher, które można wykorzystać z and.

Pełny zestaw dopasowujących złożonych jest udokumentowana w https://www.relishapp.com/rspec/rspec-expectations/v/3-4/docs/compound-expectations

+0

tldr; wstaw 'RSpec :: Matchers.define_negated_matcher: not_change,: change' w' spec_helper.rb' –

1

Jeśli próbują twierdzić, że niektóre operacje nie powinny zmienić liczbę, można zrobić

expect(something).to change(Foo, :count).by(1).and change(Bar, :count).by(0) 

Nie wiem, czy to będzie pracować z ciągów, ale może można zrobić coś wzdłuż linii:

intro_before_change = @boilerplate_original.intro 
expect { 
    click_button 'Update Boilerplate' 
    @boilerplate_original.reload 
} .to change { @boilerplate_original.title }.to('A new boilerplate') 
    .and change { @boilerplate_original.intro }.to(intro_before_change) 

to nie jest szczególnie wyraziste, ale dostaje zadanie.