Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rspec询问公共方法是否调用私有方法rubyonrails_Ruby On Rails_Ruby_Rspec - Fatal编程技术网

Ruby on rails Rspec询问公共方法是否调用私有方法rubyonrails

Ruby on rails Rspec询问公共方法是否调用私有方法rubyonrails,ruby-on-rails,ruby,rspec,Ruby On Rails,Ruby,Rspec,我试图测试公共方法create_file是否调用私有方法get_users,在私有方法add_product_数据中调用 class UsersXmlGenerator attr_reader :data def initialize(data) @data = data end def create_file builder = ::Builder::XmlMarkup.new indent: 2 builder.instruct! builder

我试图测试公共方法create_file是否调用私有方法get_users,在私有方法add_product_数据中调用

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

为什么?单元测试应该检查行为,而不是实现。你的问题是什么?我有一个测试来测试方法的结果,但是他们让我做一个测试来测试这个类是否调用了那个方法,我不知道如何测试这个方法是否正在调用it@Jzr在我看来,
get\u users
实际上是一个属于
pa
类的方法——例如,也许你可以用将其称为
pa.users\u。在这种情况下,像您当前这样测试该公共方法是有意义的,并且还可以测试是否调用了另一个类的公共方法。编写测试的主要原因之一是重构,即在不更改外部行为的情况下更改实现。但这只有在你关注后者的情况下才有效。如果将测试与实现绑定在一起,则会将自己锁定:修改代码的尝试可能会破坏测试,或者(甚至更糟)可能会导致误报。