Rspec询问公共方法是否在rails上调用私有ruby

0 ruby rspec ruby-on-rails

我正在尝试测试公共方法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
Run Code Online (Sandbox Code Playgroud)

spi*_*ann 7

我认为测试一个特定的实现细节是一个反模式,绝对无用.只要结果仍然正确,在重构后进行失败测试没有任何好处.

除此之外,我将执行以下操作来测试是否调用特定方法:

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
Run Code Online (Sandbox Code Playgroud)