【问题标题】:Testing private method in Ruby (rspec) [duplicate]在Ruby(rspec)中测试私有方法[重复]
【发布时间】:2013-05-16 23:43:56
【问题描述】:

是的,我知道,测试私有方法不是一个好主意(而且我 阅读这个线程 - http://www.ruby-forum.com/topic/197346 - 和一些 其他)

但是如何测试下面的代码呢?

我使用 xmpp4r。在我的公共方法 #listen 我开始接收 jabber 像这样的消息:

def listen
  @client.add_message_callback do |m|
    do_things_with_message(m)
  end
end

private
def do_things_with_message(m)
  #
end

#add_message_callback - 运行块,当消息到来时(在不同的线程中)

所以,测试#listen 方法很困难,它更多地测试 xmpp4r 比我的#do_things_with_message

怎么办好,测试#do_things_with_message?:) (http://www.ruby-forum.com/topic/197346#859664)

将私有方法重构为一个新对象本质上就像我将它们设为公共(以及使用一种方法的类 - 这是毫无意义的)

编辑: 这更多是关于干净代码和正确测试的理论问题。 在我的第一个链接中,人们认为测试私有方法很差。 我不想欺骗#send,但我也没有看到任何可行的重构方法

【问题讨论】:

  • 这不是一个真正的问题。您链接到的线程已经为您提供了几种技术来完成您想要的事情,并就如何围绕问题塑造您的设计提供了一些很好的建议。您可以作弊并使用send 或在测试中公开该方法,也可以重构。
  • @dbenhur 我不想作弊,但我也没有看到任何可行的重构方法
  • 如果您的代码足够复杂以至于您需要测试私有方法(即,它不仅仅是一个简单的 Model.find 或其他),那么它可能非常复杂,值得提取到无论如何,单独的课程。

标签: ruby rspec


【解决方案1】:

您可以使用 the send method 在 ruby​​ 中调用私有方法。像这样的:

@my_object = MyObject.new
@my_object.send(:do_things_with_message, some_message)

在一个看起来像这样的测试中:

it "should do a thing" do
  my_object = MyObject.new
  my_object.send(:do_things_with_message, some_message)
  my_object.thing.should == true
end

【讨论】:

  • 我知道#send。关于干净代码和正确测试的更多理论问题......
  • @Andrey 你能提供任何参考吗
【解决方案2】:

抛开您是否应该测试私有方法的问题,在 Ruby 中暂时公开私有方法是非常可能的。这就是我的意思:

# Metaprogrammatical magic to temporarily expose
# a Class' privates (methods).
class Class
  def publicize_methods
    saved_private_instance_methods = self.private_instance_methods
    self.class_eval { public *saved_private_instance_methods }
    yield
    self.class_eval { private *saved_private_instance_methods }
  end
end

你会像这样使用publicize_methods

ClassToTest.publicize_methods do
  ...
  do_private_things_with_message(m).should ???
  ...
end

【讨论】:

    【解决方案3】:

    您可能在您提到的所有资源中都听到过这种想法,但正确的“理论”方法是测试@client 接收add_message_callback,然后通过集成测试间接测试您的私有方法。单元测试的重点是你可以改变实现,你的测试仍然会通过

    【讨论】:

    • "这将是测试@client 接收到 add_message_callback" - 也许你是对的......但它仍在测试 xmpp4r gem、jabber 服务器和我的网络等。真正的工作和真正的输出做@ 987654323@。 #add_message_callback刚刚启动新线程
    • 添加监听器不是gem代码,否则你就不用写了。如果你想测试你的私有方法,要么公开,要么使用send(:do_things_with_message, args)
    猜你喜欢
    • 2019-01-23
    • 1970-01-01
    • 2019-03-12
    • 2019-03-10
    • 1970-01-01
    • 2019-07-13
    • 2013-04-08
    • 1970-01-01
    • 2019-03-09
    相关资源
    最近更新 更多