ruby-on-rails RuntimeError:#let或#subject调用时不带块

cvxl0en2  于 2023-05-02  发布在  Ruby
关注(0)|答案(2)|浏览(117)

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

its(:user) { should == user }

我试着这样做:

expect(subject.user).to eq(user)

但得到一个错误
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
eagi6jfj

eagi6jfj1#

是的,你一定是在遵循一个过时的版本,因为M。Hartl的Railstutorial书籍现在使用Minitest而不是RSpec。

expect(subject.user).to eq(user)

不起作用,因为您调用subject时没有将其 Package 在it块中。
你可以把它重写为:

it "should be associated with the right user" do
  expect(subject.user).to eq(user)
end

或者您可以使用rspec-its gem,它允许您在当前版本的RSpec中使用its语法。

# with rspec-its
its(:user) { is_expected.to eq user }
# or
its(:user) { should eq user }

但它仍然不是一个特别有价值的测试,因为您只是测试测试本身,而不是应用程序的行为。
此外,此规范适用于旧版本(pre 3.5)在模型级完成质量分配保护的轨道。
您可以在https://www.railstutorial.org/找到Rails教程的最新版本。

p1iqtdky

p1iqtdky2#

不能将its(:user) { should == user }直接转换为expect(subject.user).to eq(user)。你必须用一个it块包围它

it 'has a matchting user' do
  expect(subject.user).to eq(user)
end

相关问题