我正在尝试从电子书中运行一些示例RSpec
示例,但看起来这本书的版本较旧RSpec
,因此有些示例引用旧的RSpec API
,这会产生问题。我尽可能地解决它们,但因为我是Ruby
&的新手。 RSpec
对我来说有点挑战。
从错误日志中我可以看出它是一个范围问题,但不知道如何解决它。
subject
仍然是rspec 3.4.2版本的一部分吗?
$rspec --version
3.4.2
不工作
require "spec_helper"
describe Location do
describe "#initialize" do
subject { Location.new(:latitude => 38.911268, :longitude => -77.444243) }
expect(:latitude).to eq(38.911268)
expect(:longitude).to eq(-77.444243)
end
end
错误日志:
method_missing
:expect
在示例组(例如describe
或context
块)上不可用。它只能从单个示例(例如it
块)或在示例范围内运行的构造(例如before
,let
等)中获得。 (RSpec的::核心:: ExampleGroup :: WrongScopeError)
答案 0 :(得分:1)
正如上面的评论所述,您对此规范存在一些问题。您可以重构以下内容:
describe Location do
describe "#initialize" do
subject { Location.new(latitude: 38.911268, longitude: -77.444243) }
it "longitude & latitude is set" do
expect(subject.latitude).to eq (38.911268)
expect(subject.longitude).to eq (-77.444243)
end
end
end
这里有几点关于:
RSpec explicit subject
您可以使用let
这样定义它:
let(:location) { Location.new(latitude: 38.911268, longitude: -77.444243) }
location
而不是subject
作为测试中的对象。 Describe vs it blocks
您可以进一步添加context
块。
describe "something" do
context "in one context" do
it "does one thing" do
###expect something
end
end
context "in another context" do
it "does another thing" do
###expect something else
end
end
end
基本上expects
(即您的规范期望)总是位于it
区块内的任何代码。