我正在尝试测试公共方法create_file是否调用私有方法add_product_data中调用的私有方法get_users
class UsersXmlGenerator
  attr_reader :data
  def initialize(data)
    @data = data
  end
  def create_file
    builder = ::Builder::XmlMarkup.new indent: 2
    builder.instruct!
builder.products do |xml|
  data.each do |pa|
    add_product_data(pa, xml)
  end
   end
  end
  private
  def add_product_data(pa, xml)
    xml.product_application do |xml|
      xml.users do |xml|
        get_users(pa).each do |user|
          xml.user do |xml|
            sections_for_user(user).each do |section|
              section.add_xml(xml)
            end
          end
        end
      end
    end
  end
  def get_users(pa)
    pa.users.order_by_user.select(&:set_data?)
  end
end
我认为测试一个特定的实现细节是一个反模式,绝对无用.只要结果仍然正确,在重构后进行失败测试没有任何好处.
除此之外,我将执行以下操作来测试是否调用特定方法:
subject(:generator) { UsersXmlGenerator.new(data) }
before do
  allow(generator).to receive(:add_product_data).and_return_original
end
it 'calls `add_product_data`' do
  generator.create_file
  expect(generator).to have_received(:add_product_data)
end