什么是有效的?'在RSpec?我在哪里可以看到它?

时间:2017-09-30 06:35:04

标签: ruby validation rspec

我试图创建一个模型,需要在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;也许看看我哪里出错了?

1 个答案:

答案 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

感兴趣