RuntimeError: #let 或 #subject 在没有块的情况下调用

use*_*593 5 rspec ruby-on-rails

这是我第一次使用 Hurtl 的教程进行 rspec 测试,发现它已经过时了。我想更改这一行,因为its它不再是 rspec 的一部分:

  its(:user) { should == user }
Run Code Online (Sandbox Code Playgroud)

我试图这样做:

  expect(subject.user).to eq(user)
Run Code Online (Sandbox Code Playgroud)

但得到一个错误

RuntimeError: #let 或 #subject 在没有块的情况下调用

如果您需要,这是我的完整 rspec 测试:

require 'spec_helper'
require "rails_helper" 

describe Question do

  let(:user) { FactoryGirl.create(:user) }
  before { @question = user.questions.build(content: "Lorem ipsum") }

  subject { @question }

  it { should respond_to(:body) }
  it { should respond_to(:title) }
  it { should respond_to(:user_id) }
  it { should respond_to(:user) }

  expect(subject.user).to eq(user)
  its(:user) { should == user }

  it { should be_valid }

  describe "accessible attributes" do
    it "should not allow access to user_id" do
      expect do
        Question.new(user_id: user.id)
      end.to raise_error(ActiveModel::MassAssignmentSecurity::Error)
    end
  end

  describe "when user_id is not present" do
    before { @question.user_id = nil }
    it { should_not be_valid }
  end
end
Run Code Online (Sandbox Code Playgroud)

max*_*max 6

是的,您必须遵循过时的版本,因为 M. Hartl 的 Railstutorial 书现在使用 Minitest 而不是 RSpec。

expect(subject.user).to eq(user)
Run Code Online (Sandbox Code Playgroud)

不起作用,因为您正在调用subject而不将其包装在it块中。

您可以将其重写为:

it "should be associated with the right user" do
  expect(subject.user).to eq(user)
end
Run Code Online (Sandbox Code Playgroud)

或者你可以使用 rspec-itsgem,它可以让您在itsRSpec 的当前版本中使用语法。

# with rspec-its
its(:user) { is_expected.to eq user }
# or
its(:user) { should eq user }
Run Code Online (Sandbox Code Playgroud)

但它仍然不是一个特别有价值的测试,因为您只是在测试测试本身而不是应用程序的行为。

此外,此规范适用于在模型级别完成质量分配保护的旧版本(3.5 之前)的 Rails。

您可以在https://www.railstutorial.org/ 上找到 Rails Turorial 书籍的当前版本。


slo*_*k2k 4

不能its(:user) { should == user }直接翻译成expect(subject.user).to eq(user). 你必须用一个it方块包围它

it 'has a matchting user' do
  expect(subject.user).to eq(user)
end
Run Code Online (Sandbox Code Playgroud)