Ruby + Rspec: How should I be testing attr_accessor?

只谈情不闲聊 提交于 2020-01-22 08:50:27

问题


I have a ReturnItem class.

specs:

require 'spec_helper'

describe ReturnItem do
  #is this enough?
  it { should respond_to :chosen }
  it { should respond_to :chosen= }

end

class:

class ReturnItem
  attr_accessor :chosen
end

It seems a bit tedious since attr_accessor is used in practically every class. Is there a shortcut for this in rspec to test the default functionality of a getter and setter? Or do I have to go through the process of testing the getter and setter individually and manually for every attribute?


回答1:


I created a custom rspec matcher for this:

spec/custom/matchers/should_have_attr_accessor.rb

RSpec::Matchers.define :have_attr_accessor do |field|
  match do |object_instance|
    object_instance.respond_to?(field) &&
      object_instance.respond_to?("#{field}=")
  end

  failure_message_for_should do |object_instance|
    "expected attr_accessor for #{field} on #{object_instance}"
  end

  failure_message_for_should_not do |object_instance|
    "expected attr_accessor for #{field} not to be defined on #{object_instance}"
  end

  description do
    "checks to see if there is an attr accessor on the supplied object"
  end
end

Then in my spec, I use it like so:

subject { described_class.new }
it { should have_attr_accessor(:foo) }



回答2:


This is an updated version of the previous answer using RSpec 3, replacing failure_message_for_should for failure_message and failure_message_for_should_not for failure_message_when_negated:

RSpec::Matchers.define :have_attr_accessor do |field|
  match do |object_instance|
    object_instance.respond_to?(field) &&
      object_instance.respond_to?("#{field}=")
  end

  failure_message do |object_instance|
    "expected attr_accessor for #{field} on #{object_instance}"
  end

  failure_message_when_negated do |object_instance|
    "expected attr_accessor for #{field} not to be defined on #{object_instance}"
  end

  description do
    "assert there is an attr_accessor of the given name on the supplied object"
  end
end


来源:https://stackoverflow.com/questions/24434381/ruby-rspec-how-should-i-be-testing-attr-accessor

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!