簡體   English   中英

如何在Ruby中調用類的所有實例方法?

[英]How to invoke all instance methods of a class in Ruby?

我目前正在努力將自己的小測試方法運行器腳本放在一起。

我需要某種方法來調用類中的所有方法。 當我調用run_tests方法時,我的程序陷入了無限循環。 是什么原因造成的,有什么解決方案?

class FadTest < SeleniumTest
  def can_open_page
    @driver.get(@base_url + "/")
    wait_element_present(:link, "DOCTORS")
    @driver.find_element(:link, "DOCTORS").click
    puts "page opened"
  end

  def test_method
    puts "it works"
  end

  def run_tests
    klass = self.class
    klass.instance_methods(false).each do |method|
      klass.instance_method(method).bind(self).call
    end
  end 
end

如Wand Maker所述run_tests涉及遞歸。 您的代碼通過以下方式執行:

  1. 查找某個對象的類
  2. 調用SomeClass.instance_methods.each {}
  3. 一旦達到run_tests ,就可以重新開始迭代。
  4. 無限循環-您永遠無法達到其余的實例方法。

我不確定您如何設計測試,因此這里有一些解決問題的方法

如果所有測試對象都具有FadTest類,則可以在迭代中編輯邏輯,我的首選解決方案是Tin Man建議的解決方案

klass.instance_methods(false).each do |method|
  next if method == :run_tests
  # ...
end

唯一的問題是您仍在掃描:run_tests元素。 如果您想保持完整的證明,而在數組中沒有:run_tests ,可以嘗試Cary Swoveland的建議

(klass.instance_methods(false) - [:run_tests]).each {}

如果被測試對象的類不是 FadTest ,那么我建議重寫該方法。

def self.run_tests(object)
  klass = object.class
  klass.instance_methods(false).each {}
end

FadTest.run_tests(some_object)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM