Rspec:让我们不行

时间:2015-05-26 13:49:23

标签: ruby-on-rails ruby rspec

我有一些Rspec测试,我用let初始化变量:

  describe 'methods' do

    let(:order)   { Order.new }
    let(:event_1) { FactoryGirl.create(:event) }
    let(:event_2) { FactoryGirl.create(:event) }

    context 'should checks if any event is paid' do
      order.events << event_1
      order.events << event_2
      order.events_paid?.should == true
    end

    context 'should write aasm state' do
      order.aasm_write_state('new')
      order.state.CanonicalName.should == 'new'
    end

  end

但我收到错误'method_missing': 'order' is not available on an example group (e.g. a 'describe' or 'context' block). It is only available from within individual examples (e.g. 'it' blocks) or from constructs that run in the scope of an example (e.g. 'before', 'le', etc). (RSpec::Core::ExampleGroup::WrongScopeError)

为什么let初始化无效?

2 个答案:

答案 0 :(得分:10)

我看到两个错误:

  • 你还没有将你的考试包裹在it区块内(!)

  • 您尝试将事件与order相关联,但order未被保留

Sidenote,现在的惯例是使用以下语法:

expect(order.events_paid?).to be true

答案 1 :(得分:2)

TL; DR:将context更改为it,它会起作用。

这里的问题是context定义了一个示例组,而不是一个示例。示例组和示例根本不同;示例组是一个用于对具有公共设置代码的示例进行分组的类,并且示例作为该类的实例运行。使用let时,您正在定义可从同一示例组中定义的示例访问的方法。 it是定义示例的主要方法。

有关详细信息,请参阅rspec-core自述文件中的note on scope

在旁注中,我写了你试图解释的错误信息,但显然它没有实现这个目的。您对错误消息感到困惑的是什么?我们怎样才能让它变得更好,以便其他用户不会因此而绊倒?