2015-10-06 41 views
0

我有一種情況,我有一個類的方法,可以在類上根據該類是否包含一個模塊。例如:檢查包含的類方法可以不存在

class HomePage 
    include Symbiont 

    url_matches 'test' 
end 

class WeightPage 
    include Symbiont 
end 

這裏當包含Symbiont時,它提供了一個名爲url_matches的類方法。但是,請注意,您不必使用它,如WeightPage所示。因此,儘管Symbiont使該方法可用,但包含Symbiont的類不必使用它。

問題出在這裏:我想要做的是檢查班級是否實際上在利用它。

但我無法弄清楚如何。所以我們可以說我這樣做:

@home = HomePage.new 
@weight = WeightPage.new 

我希望能夠做這樣的事情:

@home.respond_to?(:url_matches) # should return true 
@weight.respond_to?(:url_matches) # should return false 

這是行不通的。兩者都返回false。然後我嘗試了這個類:

@home.class.respond_to?("url_matches") 
@weight.class.respond_to?("url_matches") 

但是,它總是返回true。

我嘗試這樣做:

@home.class.public_instance_methods.include?(:url_matches) 
@weight.class.public_instance_methods.include?(:url_matches) 

始終返回false。

@home.class.method_defined?(:url_matches) 
@weight.class.method_defined?(:url_matches) 

總是返回false。

在這一點上,我不知道該怎麼做。

底層代碼上下文

在上下文中的代碼可能會有點難以遵循這個問題的目的,只是爲它提供:

這裏是被包含在「共生體」模塊:

https://github.com/jnyman/symbiont/blob/master/lib/symbiont.rb

請特別注意這部分:

module Symbiont 
    def self.included(caller) 
    caller.extend Symbiont::Assertion 

的共生::斷言是在這裏:

https://github.com/jnyman/symbiont/blob/master/lib/symbiont/assertions.rb

也就是說在url_matches從何而來。所以當Symbiont被包含在一個類中時,如前所示,這就是允許在類中聲明url_matches的原因。

回答

1

您只需將方法添加到兩個類中,即可將url_matches方法添加到兩個類中。

這就是說:如果類對這種方法做出響應,但是如果調用該方法,則您不感興趣。如果您查看implementation of that method,您會看到該方法設置了一個@url_match變量。所以你的問題應該是:是否設置了@url_match變量?

這可以通過使用instance_variable_get來實現:

@home.class.instance_variable_get(:@url_match) 
@weight.class.instance_variable_get(:@url_match) 
+0

不知道這是一個好主意。 '@ url_match'似乎是一個實現細節,不應該泄漏到你的代碼中。 – Magnuss

+0

@Magnuss好點,但實際上我在這裏做的邏輯是該代碼中另一個類的一部分。我沒有提到這一點,以免使事情複雜化。我正在嘗試提供的答案中提供的代碼;將會更新,如果它看起來不錯。到目前爲止,所有跡象都是肯定 –

+0

@Magnuss:我同意你的看法,'@ url_match'是一個實現細節,在gem之外使用這個變量可能是個壞主意。但是,檢查變量似乎是目前唯一的選擇,因爲OP沒有告訴我們爲什麼他需要知道該方法是否被調用,因爲該寶石不提供另一種選擇。 – spickermann

0

什麼

expect(HomePage).to respond_to(:url_matches) 

0

我的2美分:我想我會修補url_matches方法,使得在呼叫時,它設置一個類變量@@symbiont_enabledtrue,而且我添加另一個類的方法,看起來像這樣:

def self.symbiont_enabled? 
    @@symbiont_enabled 
end 
+0

我在想同一件事 – Roko

相關問題