2015-09-18 13 views
8

Próbuję uruchomić blok before(:each) dla wszystkich specyfikacji z wyjątkiemtype: :feature.Rspec.config before (: each) except for specific: types

Jedynym sposobem na sprawdzenie, czy działa, jest wycinanie i wklejanie oraz oddzielne bloki konfiguracji dla każdego typu. (:type => :model, :type => :service itp)

Spec/rails_helper.rb

# To speed up tests, stub all Paperclip saving and reading to/from S3 
config.before(:each, :type => :model) do 
    allow_any_instance_of(Paperclip::Attachment).to receive(:save).and_return(true) 
end 

Czy istnieje bardziej DRY podejście?

+0

próbowałeś 'config.before (: każdy,: {! | V | v =: funkcja} type => lambda)' – Yule

+1

@ Yule to działa! i bardzo podoba mi się to podejście. Opublikuj odpowiedź, a ja ją zaakceptuję. – madcow

+0

Świetnie! Tylko przeczucie od innych dokumentów, które czytam. Odpowiedź została dodana. Cieszę się, że mogłem pomóc. – Yule

Odpowiedz

10

To, co przechodzisz do swojego poprzedniego bloku, to "conditions hash". RSpec zastosuje tylko wcześniej do tych przykładów lub kontekstów, które pasują do tych warunków.

Funkcja mieszania jest dość elastyczna i można wykonywać proste czynności, takie jak type: :model, ale można wyszukiwać dowolne typy metadanych z dowolnymi nazwami.

Jako przykład od filter run excluding

:foo => 'bar' 
    :foo => /^ba/ 
    :foo => lambda {|v| v == 'bar'} 
    :foo => lambda {|v,m| m[:foo] == 'bar'} 

:foo może być cokolwiek, na przykład, typ. Zapewnia to jednak dużą elastyczność, szczególnie w przypadku składni lambda, która pozwala określić, w jakich okolicznościach ma działać specyfikacja.

W twoim przypadku można zrobić coś takiego:

config.before(:each, :type => lambda {|v| v != :feature}) do 
    allow_any_instance_of(Paperclip::Attachment).to receive(:save).and_return(true) 
end 
2

Możesz użyć unless, aby ocenić przykładowe metadane za pomocą haka around.

RSpec.configure do |config| 
    config.around(:each) do |example| 
    example.run unless example.metadata[:type].eql? :feature 
    end 
end