2013-02-07 9 views
10

Vorrei utilizzare [1,2,3].should include(1) in irb. Ho provato:Come utilizzare le aspettative di RSpec in 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>' 

Ma non funziona però it's a valid case. Come posso usare [1,2,3].should include(1)?

risposta

13

Sei vicino, ma chiamando il numero include al livello superiore chiamerai Module#include. Per aggirare il problema è necessario rimuovere il metodo di inclusione originale in modo che venga chiamato il numero include di RSpec.

Prima cerchiamo di capire dove il sistema include proviene da:

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

Ok. Sembra che sia definito in main. Questo è l'oggetto di livello superiore di Ruby. Quindi cerchiamo di rinominare e rimuovere l'originale includono:

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

Ora possiamo metterci al lavoro:

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