我试图创建一个模型,需要在RSpec中通过一系列验证测试。但是,我经常收到错误
expected #<Surveyor::Answer:0x0055db58e29260 @question=#<Double Surveyor::Question>, @value=5> to respond to `valid?`
我的理解(from here)是否有效?&#39;检查没有错误添加到模型中。我无法找到任何错误,但上述消息仍然存在。
这是我的模特
module Surveyor
class Answer
attr_accessor :question, :value
def initialize(params)
@question = params.fetch(:question)
@value = params.fetch(:value)
end
end
end
课程问题
module Surveyor
class Question
attr_accessor :title, :type
def initialize(params)
@title = params.fetch(:title, nil)
@type = params.fetch(:type)
end
end
end
这是我试图传递的测试
RSpec.describe Surveyor::Answer, '03: Answer validations' do
let(:question) { double(Surveyor::Question, type: 'rating') }
context "question validation" do
context "when the answer has a question" do
subject { described_class.new(question: question, value: 5) }
it { should be_valid }
end
end
我的理解是否有效?&#39;正确?我能看到有效吗?&#39;也许看看我哪里出错了?
答案 0 :(得分:2)
RSpec实际上没有名为be_valid
的匹配器,而是有一些动态predicate matchers:
对于任何谓词方法,RSpec都会为您提供相应的匹配器。简单地加上前缀 方法
be_
并删除问号。例子:expect(7).not_to be_zero # calls 7.zero? expect([]).to be_empty # calls [].empty? expect(x).to be_multiple_of(3) # calls x.multiple_of?(3)
因此,通过调用it { should be_valid }
,您的主题必须回复valid?
方法。如果您正在测试ActiveRecord
模型,那么它们会采用valid?
方法,但您的模型却没有。因此,如果您想测试Answer
是否有效,您需要决定&#34;什么是有效答案?&#34;并编写一个检查这些条件的方法。如果您想要一个类似于Rails模型的API,您可能会对使用ActiveModel::Validations