我想测试对以下类的属性进行的验证:
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匹配器进行测试?
答案 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
虽然没有测试过。