2015-09-11 25 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

相关问题