2012-12-16 14 views
8

Ho creato 2 oggetti diversi in rubino con esattamente gli stessi attributi e valori.Ruby/Rspec: è possibile confrontare il contenuto di due oggetti?

mi piacerebbe confrontare la società che il contenuto di entrambi gli oggetti è lo stesso, ma i seguenti confronti:

actual.should == expected 
actual.should eq(expected) 
actual.should (be expected) 

riuscire con:

Diff: 
    @@ -1,4 +1,4 @@ 
    -#<Station:0x2807628 
    +#<Station:0x2807610 

non v'è alcun modo in RSpec/ruby per raggiungere facilmente questo?

Saluti !!

risposta

0

Forse dovresti considerare di sovraccaricare l'operatore uguale sull'oggetto.

9

Un modo idiomatico per fare questo è di ignorare il #== dell'operatore:

class Station 
    def ==(o) 
    primary_key == o.primary_key 
    end 

    def hash 
    primary_key.hash 
    end 
end 

Quando si esegue questa operazione, in genere si desidera sovrascrivere il metodo #hash pure. È meno comune eseguire l'override di #eql? o #equal?.

EDIT: Un'altra cosa che si può fare in questo caso specifico, che non comporta l'override #==, è di fare un custom RSpec matcher.

+0

Ciao Eric, grazie per la risposta, cercando di capire questo metodo. Perché abbiamo bisogno di sovrascrivere '# hash' e quando verrebbe invocato? Come dovremmo fare questo confronto una volta implementato, qualcosa come 'station_one. == (station_two)'? – mickael

+0

@mickael: nessun problema. È necessario sovrascrivere '# hash' in modo che il comportamento dell'oggetto continui ad avere senso quando lo si utilizza come chiave in un oggetto Hash. Si fa uso dell'operatore '# ==' sovrascritto in 'Rspec' semplicemente facendo' obj1.should == obj2' in un blocco 'it' o simile. –

2

Un po 'in ritardo, ma si potrebbe serializzare esso, per esempio:

require 'json' 

expect(actual.to_json).to eq(expected.to_json) #new rspec syntax 
actual.to_json.should eq(expected.to_json) #old rspec syntax 
0

Utilizzare i have_attributes Matcher per specificare che gli attributi di un oggetto corrispondono gli attributi attesi:

Person = Struct.new(:name, :age) 
    person = Person.new("Jim", 32) 

    expect(person).to have_attributes(:name => "Jim", :age => 32) 
    expect(person).to have_attributes(:name => a_string_starting_with("J"), :age => (a_value > 30)) 

Relishapp RSpec Docs

Problemi correlati