2015-09-11 75 views
0

假設我有一些適當的結構元這樣的代碼如何在ruby中對使用method_missing定義的方法進行存根?

class Administrator < ParseInterface 
    attr_accessor :args, :new_student 
    include GeneralHelper 

    def initialize args = {} 
    @args = args 
    @new_student = build_student 
    end 

end 

class ParseInterface 
    PARSE_METHOD_PREFIX = /\A(parse_){1}/ 

    def self.method_missing method_name, args = nil 
    parse_method?(method_name) ? call_parse(method_name, args) : super 
    end 

    def self.parse_method? method_name 
    method_name.to_s.match(PARSE_METHOD_PREFIX) ? true : false 
    end 

    def self.to_parse method_name 
    (remove_parse_prefix(method_name)).camelize(:lower) 
    end 

    def self.remove_parse_prefix method_name 
    method_name.to_s.gsub(PARSE_METHOD_PREFIX, "") 
    end 

    def self.call_parse method_name, args 
    set_session_token args 
    begin 
     Parse::Cloud::Function.new(to_parse(method_name)).call(args) 
    rescue Exception => e 
     NewRelic::Agent.agent.error_collector.notice_error(e) 
    end 
    end 

end 

我要打電話之類的東西Administrator.parse_do_stuff會發現parse前綴,然後對解析API的後續調用的能力和解析接口類。我想存根其中的一些動態生成的方法,特別是,我希望能夠

allow(Administrator).to receive(:parse_rooms_for_user).and_return([{objectId: @room.parse_pointer }]) 

但RSpec的是拋出一個未實現的錯誤。我看了一篇相當不錯的博文,http://blog.enriquez.me/2010/2/21/dont-forget-about-respond-to-when-implementing-method-missing/似乎正在接近這一點,但我不清楚解決方案。 Ergo,如何在Ruby中存儲一個動態生成的類方法?

THX,

JD

回答

2

您與鏈接http://blog.enriquez.me/2010/2/21/dont-forget-about-respond-to-when-implementing-method-missing/回答了自己的問題。您需要添加一個respond_to_missing?方法,以準確返回您的method_missing或對象是否會響應某個特定的呼叫。總之,添加這個方法:

def self.respond_to_missing?(method, private = false) 
    parse_method?(method) 
end 

編輯:更改爲使用respond_to_missing?代替respond_to?,看到Jörg W Mittag's comment

+0

這場景正是''respond_to_missing加入到支持? –

+0

@JörgWMittag謝謝,編輯。 – Shelvacu

相關問題