Ruby on rails Rspec询问公共方法是否调用私有方法rubyonrails
我试图测试公共方法create_file是否调用私有方法get_users,在私有方法add_product_数据中调用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
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。在这种情况下,像您当前这样测试该公共方法是有意义的,并且还可以测试是否调用了另一个类的公共方法。编写测试的主要原因之一是重构,即在不更改外部行为的情况下更改实现。但这只有在你关注后者的情况下才有效。如果将测试与实现绑定在一起,则会将自己锁定:修改代码的尝试可能会破坏测试,或者(甚至更糟)可能会导致误报。