МиниТест рушится - PullRequest
       9

МиниТест рушится

0 голосов
/ 20 декабря 2011

Я хочу перезаписать отправку в Object, например,

class Object
    @@object_send = self.instance_method( :send )

    def send *args
        @@object_send.bind( self ).call *args
    end
end

или

class Object
    def send *args
        __send__ *args
    end
end

или

class Object
    alias_method :old_send, :send

    def send *args
        old_send *args
    end
end

но все эти опции приводят к появлению этой ошибки

/opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:871:in `block in process_args': unsupported argument type: Integer (ArgumentError)
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:862:in `new'
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:862:in `process_args'
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:912:in `_run'
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:905:in `run'
    from /opt/local/lib/ruby1.9/gems/1.9.1/gems/minitest-2.8.1/lib/minitest/unit.rb:685:in `block in autorun'

Что я могу сделать?

Обновление: Попытка обновления до 2.9.1, но это не решило проблему

1 Ответ

1 голос
/ 20 декабря 2011

Без MWE мне сложно проанализировать вашу проблему.Возможно, я нашел первый намек на вашу проблему.

Я пытался восстановить ошибку, но безуспешно:

class Object
    alias_method :old_send, :send

    def send *args
        old_send *args
    end
end
n = 5
puts n.send(:*, 2)

Я получаю 10.

Но сБлоки У меня проблема:

puts n.send(:times){ |i| p i } #-> #<Enumerator:0xb778a8>

С небольшой модификацией вы можете увидеть, что происходит:

class Object
    alias_method :old_send, :send

    def send *args
        puts "send called with #{args}"  #--> [:times]
        old_send *args
    end
end

n = 5
n.send(:times){ |i| p i }

Вы получите

send called with [:times]

Блок отсутствует.Вы должны добавить параметр proc к своему переопределению:

class Object
    alias_method :old_send, :send

    def send *args, &proc
        old_send *args, &proc
    end
end

n = 5
n.send(:times){ |i| p i } #-> 1 2 3 4 5
...