我有一些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
初始化无效?
答案 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。
在旁注中,我写了你试图解释的错误信息,但显然它没有实现这个目的。您对错误消息感到困惑的是什么?我们怎样才能让它变得更好,以便其他用户不会因此而绊倒?