使用适用于attr_reader的Shoulda匹配器

时间:2015-07-28 19:31:10

标签: ruby-on-rails ruby rspec shoulda

我想测试对以下类的属性进行的验证:

class R
  include ActiveModel::Validations

  attr_reader :attribute

  validates :attributes, presence: true

  def initialize(attribute = {})
    @attribute = attribute
  end
end

现在我的测试是这样的:

RSpec.describe R, type: :model do
  context 'validations' do
    subject { R.new(1) }

    it { should validate_presence_of(:attribute) }
  end
end

但这会导致错误:

NoMethodError:
   undefined method `attributes=' for

如果我将attr_reader更改为attr_accessor,则测试通过。

如何保持attr_reader不变,仍然可以通过Shoulda匹配器进行测试?

2 个答案:

答案 0 :(得分:1)

应该通过尝试在参数上设置空白值来使validate_presence_of工作,因此它需要一个setter方法,并且只能使用attr_reader。

答案 1 :(得分:0)

你可以在这个主题上存根attribute=

RSpec.describe R, type: :model do
  context 'validations' do
    subject { R.new(1) }
    before { subject.stub('attribute=') { |arg| subject.instance_variable_set(:attribute, arg) } }

    it { should validate_presence_of(:attribute) }
  end
end

虽然没有测试过。