let () должен быть ограничен примерами блоков и не использоваться в других местах.Вы на самом деле не используете let () в качестве параметров.Причина, по которой он не работает с it_behaves_like в качестве параметра, связана с тем, как определяется let ().Каждая группа примеров в Rspec определяет пользовательский класс.let () определяет метод экземпляра в этом классе.Однако, когда вы вызываете it_behaves_like в этом пользовательском классе, он вызывает на уровне класса, а не из экземпляра.
Я использовал let () следующим образом:
shared_examples_for 'any connection' do
it 'should have valid connection' do
connection.valid?
end
end
describe Connection do
let(:connection) { Connection.new(settings) }
let(:settings) { { :blah => :foo } }
it_behaves_like 'any connection'
end
Я сделал нечто похожее на ответ bcobb, хотя редко использую shared_examples:
module SpecHelpers
module Connection
extend ActiveSupport::Concern
included do
let(:connection) { raise "You must override 'connection'" }
end
module ClassMethods
def expects_valid_connection
it "should be a valid connection" do
connection.should be_valid
end
end
end
end
end
describe Connection do
include SpecHelpers::Connection
let(:connection) { Connection.new }
expects_valid_connection
end
Определение этих общих примеров более многословно, чем использование общих примеров.Я думаю, что «it_behave_like» более неудобно, чем прямое расширение Rspec.
Очевидно, вы можете добавить аргументы в .expected_valid_connections
Я написал это, чтобы помочь классу rspec друга: http://ruby -lambda.blogspot.com / 2011/02 / agile-rspec-with-let.html ...