无法在RSpec测试

时间:2016-02-20 06:05:57

标签: ruby-on-rails ruby testing rspec

我正在尝试从电子书中运行一些示例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_missingexpect在示例组(例如describecontext块)上不可用。它只能从单个示例(例如it块)或在示例范围内运行的构造(例如beforelet等)中获得。 (RSpec的::核心:: ExampleGroup :: WrongScopeError)

1 个答案:

答案 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

  • 文档说:使用组范围中的主题来明确定义值 由示例范围中的subject方法返回。
  • 您可以使用let这样定义它:

  • let(:location) { Location.new(latitude: 38.911268, longitude: -77.444243) }

  • 然后,您将使用location而不是subject作为测试中的对象。

Describe vs it blocks

  • 文档说:describe方法创建一个示例组。在传递给的块内 描述您可以使用describe或context声明嵌套组 方法,或者您可以使用它来声明示例或指定方法。
  • 您可以进一步添加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区块内的任何代码。