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)
是的,您必须遵循过时的版本,因为 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 书籍的当前版本。
不能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)
| 归档时间: |
|
| 查看次数: |
4785 次 |
| 最近记录: |