Rspec允许作用域



我认为我有一个问题与rspec let和范围。我可以在示例中使用let定义的方法("it"块),但不能在外部使用(我执行let的描述块)。

5   describe Connection do
8     let(:connection) { described_class.new(connection_settings) }
9 
10    it_behaves_like "any connection", connection
24  end

当我尝试运行这个规范时,我得到了错误:

connection_spec。Rb:10: undefined local变量或方法' connection' for类:0 xae8e5b8 (NameError)

如何将连接参数传递给it_behaves_like?

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更尴尬。

显然,您可以向.expects_valid_connections

添加参数

我写这个是为了帮助一个朋友的rspec类:http://ruby-lambda.blogspot.com/2011/02/agile-rspec-with-let.html…

编辑-完全没有我的第一个解决方案。萧浩生给出了很好的解释

你可以给it_behaves_like一个这样的块:

describe Connection do
  it_behaves_like "any connection" do
    let(:connection) { described_class.new(connection_settings) }
  end
end

我发现,如果您不显式传递由let声明的参数,它将在共享示例中可用。

:

describe Connection do
  let(:connection) { described_class.new(connection_settings) }
  it_behaves_like "any connection"
end

连接将在共享的示例规范

中可用。

我找到适合我的方法了:

   describe Connection do
     it_behaves_like "any connection", new.connection
     # new.connection: because we're in the class context 
     # and let creates method in the instance context, 
     # instantiate a instance of whatever we're in
   end

这个适合我:

  describe "numbers" do
    shared_examples "a number" do |a_number|
      let(:another_number) {
        10
      }
      it "can be added to" do
        (a_number + another_number).should be > a_number
      end
      it "can be subtracted from" do
        (a_number - another_number).should be < a_number
      end
    end
    describe "77" do
      it_should_behave_like "a number", 77
    end
    describe "2" do
      it_should_behave_like "a number", 2
    end
  end

相关内容

  • 没有找到相关文章

最新更新