2015-10-19 8 views
0

У меня есть этот класс:параметров method_missing Рубиновых

class Mock 

    attr_accessor :implementations 

    def initialize() 
     @implementations = Array.new 
    end 

    def method_missing(method_name, *arguments, &block) 
     implementation = findImplementation(method_name, arguments) 
     if implementation.nil? 
      raise "Undefined method #{method_name}." 
     else 
      puts "Implemented Method!" 
     end 
    end 

    def implement_method(method_name, parameters, return_value) 
     @implementations.unshift(Implementation.new(method_name, parameters, return_value)) 
     @method_to_mock = nil 
     @parameter = nil 
     @return_value = nil 
    end 

    def findImplementation(method_name, args) 
     return @implementations.find { |i| i.method_name == method_name && i.parameters == args } 
    end 

end 

Если я делаю:

m = Mock.new 
m.implement_method(:something, 10, true) 
m.findImplementation(:something, 10) 

Он возвращает реализацию я добавил во второй строке. Но когда я это делаю:

m.something(10) 

Он выводит «Неопределенный метод». По-видимому, вызов findImplementation, который я делаю внутри метода method_missing, возвращает nil. Что я делаю не так?

+0

делает вашу 'find' работу? Когда вы 'binding.pry' в' implement_method' после unshifting, это там? Начать отладку! :) Несвязанный, но это должно быть 'find_implementation'. –

+0

'* argumentss' создаст' Array', вероятно, поэтому он возвращает 'nil', потому что он не может найти« Реализация »с параметрами' [10] ', потому что вы хотите найти его с параметрами' 10'. Не уверен, что вы пытаетесь выполнить, поэтому ответ будет малопригодным, но в этом проблема. – engineersmnky

+0

@engineersmnky да его проблема, как я могу решить ее, чтобы сделать эти ценности сравнимыми? – Alan

ответ

0

Простейшим решением является передача ваших параметров в виде массива. (Как бы вы работать с несколькими Params так или иначе?)

Итак, ваш код становится

m = Mock.new 
m.implement_method(:something, [10], true) 
m.findImplementation(:something, [10]) 
Смежные вопросы