2013-02-07 18 views
10

Chciałbym użyć [1,2,3].should include(1) w irb. Próbowałem:Jak korzystać z oczekiwań RSpec w irb

~$ irb 
1.9.3p362 :001 > require 'rspec/expectations' 
=> true 
1.9.3p362 :002 > include RSpec::Matchers 
=> Object 
1.9.3p362 :003 > [1,2,3].should include(1) 
TypeError: wrong argument type Fixnum (expected Module) 
    from (irb):3:in `include' 
    from (irb):3 
    from /home/andrey/.rvm/rubies/ruby-1.9.3-p362/bin/irb:16:in `<main>' 

Ale to nie działa choć it's a valid case. Jak mogę użyć [1,2,3].should include(1)?

Odpowiedz

13

Jesteś blisko, ale nazywając include na najwyższym poziomie będzie wywołującego Module#include. Aby ominąć to, musisz usunąć oryginalną metodę include, aby zamiast tego zadzwonić do RSPec'a include.

Najpierw niech dowiedzieć się, gdzie system include pochodzi z:

> method :include 
=> #<Method: main.include> 

OK. Wygląda na to, że jest zdefiniowany w main. To jest obiekt najwyższego poziomu Ruby. Warto więc zmienić nazwę i usunąć oryginał obejmują:

> class << self; alias_method :inc, :include; remove_method :include; end 

Teraz możemy zabrać się do pracy:

> require 'rspec' 
> inc RSpec::Matchers 
> [1,2,3].should include(1) 
=> true