Rspec中'let'的范围是什么?

时间:2015-10-18 00:23:06

标签: ruby rspec let

我尝试了以下内容:

  describe "#check_recurring_and_send_message" do

    let(:schedule) {ScheduleKaya.new('test-client-id')}

    context "when it is 11AM and recurring event time is 10AM" do

      schedule.create_recurring_event('test-keyword', 'slack', 'day', '10 AM') 

      it "sends an SMS" do

      end

      it "set the next_occurrence to be for 10AM tomorrow" do 
        tomorrow = Chronic.parse("tomorrow at 10AM")
        expect(schedule.next_occurrence).to eq(tomorrow)
      end

    end

  end

我在范围内遇到错误:

`method_missing': `schedule` 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`, `let`, etc). (RSpec::Core::ExampleGroup::WrongScopeError)

不仅对于这个例子而且在其他时候,我不完全理解允许scope对于let和在Rspec中创建实例是什么。

let这里的用例与我使用schedule = blah blah创建的用例有什么关系?

我想我理解错误的字面意图:我不能仅在schedule context中使用it.但是正确的方法是什么呢?将东西置于描述,上下文或它之下的方式以及以何种方式?

1 个答案:

答案 0 :(得分:5)

Let被懒惰地评估,当你想要跨测试共享一个变量时,这是很好的,但只有当测试需要它时。

来自文档:

  

使用let来定义memoized帮助器方法。该值将被缓存   在同一个示例中跨多个调用但不跨越示例。

     

请注意,let是惰性计算的:直到第一个才进行评估   调用它定义的方法的时间。你可以用let!迫使   每个例子之前的方法调用。

     

默认情况下,let是线程安全的,但您可以将其配置为不通过   禁用config.threadsafe,这使得执行速度更快。

由于这一行,你在这里找不到方法:

schedule.create_recurring_event('test-keyword', 'slack', 'day', '10 AM') 

您似乎希望在it中的每个context块之前评估该行。你只需要重写它:

describe "#check_recurring_and_send_message" do
  let(:schedule) {ScheduleKaya.new('test-client-id')}
  context "when it is 11AM and recurring event time is 10AM" do
    before(:each) do
      schedule.create_recurring_event('test-keyword', 'slack', 'day', '10 AM')
    end
    it "sends an SMS" do
    end
    it "set the next_occurrence to be for 10AM tomorrow" do
      tomorrow = Chronic.parse("tomorrow at 10AM")
      expect(schedule.next_occurrence).to eq(tomorrow)
    end
  end
end