我尝试了以下内容:
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.
但是正确的方法是什么呢?将东西置于描述,上下文或它之下的方式以及以何种方式?
答案 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