Как передать переменную экземпляра в общий пример RSpec
Я использую RSpec (2.10.1) для тестирования валидаций на модели и извлек некоторый код, чтобы поделиться им с другими валидациями модели. Валидации были впервые записаны в таблице компаний, поэтому код выглядит следующим образом:
# support/shared_examples.rb
shared_examples "a text field" do |field, fill, length|
it "it should be long enough" do
@company.send("#{field}=", fill * length)
@company.should be_valid
end
etc...
end
И использование:
# company_spec.rb
describe Company do
before { @company = Company.new( init stuff here ) }
describe "when address2" do
it_behaves_like "a text field", "address2", "a", Company.address2.limit
end
etc...
end
Я хотел бы передать @company
в качестве параметра в общий пример, чтобы я мог повторно использовать код для различных моделей, что-то вроде этого:
# support/shared_examples.rb
shared_examples "a text field" do |model, field, fill, length|
it "it should be long enough" do
model.send("#{field}=", fill * length)
model.should be_valid
end
etc...
end
И использование:
# company_spec.rb
describe Company do
before { @company = Company.new( init stuff here ) }
describe "when address2" do
it_behaves_like "a text field", @company, "address2", "a", Company.address2.limit
end
etc...
end
Однако, когда я делаю это, я получаю undefined method 'address2' for nil:NilClass
. Похоже, что @company
не передается (не в области видимости?) Как мне заставить что-то подобное работать?1 ответ:
Проблема в том, что
self
в группе примеров отличается отself
в крюкеbefore
, поэтому это не одна и та же переменная экземпляра, даже если она имеет одно и то же имя.Я рекомендую вам использовать
let
для таких случаев, как:# support/shared_examples.rb shared_examples "a text field" do |field, fill, length| it "it should be long enough" do model.send("#{field}=", fill * length) model.should be_valid end end # company_spec.rb describe Company do describe "when address2" do it_behaves_like "a text field", "address2", "a", Company.address2.limit do let(:model) { Company.new( init stuff here ) } end end end