gpt4 book ai didi

ruby-on-rails - 无法访问 RSpec 测试中的变量

转载 作者:行者123 更新时间:2023-11-28 20:11:22 25 4
gpt4 key购买 nike

我正在尝试运行电子书中的一些示例 RSpec 示例,但看起来这本书使用的是旧版本的 RSpec 因此一些示例引用了旧的 RSpec产生问题的 API。我正在尝试尽可能多地解决它们,但由于我是 RubyRSpec 的新手,这对我来说有点挑战。

从错误日志中我可以看出这是一个范围问题,但不确定如何解决。

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 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)

最佳答案

正如上面的评论所述,您对此规范存在一些问题。您可以重构为以下内容:

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 显式主题

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

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

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

Describe vs it blocks

  • 文档说:describe 方法创建了一个示例组。在传递给的 block 内describe 您可以使用 describe 或 context 声明嵌套组方法,或者您可以使用 it 声明示例或指定方法。
  • 您还可以进一步添加 context block 。

    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 block 中。


关于ruby-on-rails - 无法访问 RSpec 测试中的变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35519827/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com