【问题标题】:Using Shoulda matchers for attr_reader为 attr_reader 使用 Shoulda 匹配器
【发布时间】:2015-07-28 19:31:09
【问题描述】:

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

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 匹配器的测试通过?

【问题讨论】:

    标签: ruby-on-rails ruby rspec shoulda


    【解决方案1】:

    Should 的validate_presence_of 通过尝试在参数上设置一个空白值来工作,因此它需要一个 setter 方法并且不能仅与 attr_reader 一起使用。

    【讨论】:

      【解决方案2】:

      你可能会在这个主题上存根 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
      

      虽然还没有测试过。

      【讨论】:

        猜你喜欢
        • 2013-08-10
        • 1970-01-01
        • 2013-09-12
        • 2012-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多