2010-08-08 14 views
19

Von dem, was ich verstanden habe, überprüft die gleiche Methode, ob das Objekt das gleiche ist.Rspec gleiche Methode

person = Person.create!(:name => "David") 
Person.find_by_name("David").should equal(person) 

Das sollte stimmen.

Aber gibt es hier nicht zwei verschiedene Objekte?

Wie könnten zwei Objekte gleich sein? Ich verstehe das nicht.

+0

Auf welche zwei verschiedenen Objekte beziehen Sie sich? – jtbandes

+0

@jtbandes: In der ersten Zeile wird ein Objekt zurückgegeben, auf das "person" verwiesen wird. In der zweiten Zeile wird ein Objekt zurückgegeben und dieses Objekt sollte der Person entsprechen. Sind das nicht zwei Objekte? –

+0

Entweder a) das exakt gleiche Objekt könnte zurückgegeben werden; oder b) das zweite Objekt könnte gleich sein (durch seine eigene "gleiche?" oder andere Methode) zu der ersten, wie die gleichen Eigenschaften (in diesem Fall "Name").Lesen Sie die ActiveRecord :: Base-Dokumentation. – jtbandes

Antwort

14

equal überprüft, ob die Referenz identisch ist. Es entspricht der Object#equal? Methode. Sie möchten == verwenden, um diese Objekte zu vergleichen.

37

Rails und RSpec Gleichheitstests haben eine Vielzahl von Auswahlmöglichkeiten.

Schienen 3.2 ActiveRecord :: Base verwendet den Gleichheitsvergleicher ==.

Es gibt true zurück, zwei verschiedene Arten:

  • Wenn self exakt das gleiche Objekt als Objektvergleich ist
  • Wenn self vom gleichen Typ wie das Vergleichsobjekt ist und die gleiche ID

Beachten Sie, dass ActiveRecord :: Base die ==-Methode hat, die als eql? aliased ist. Dies unterscheidet sich von typischen Ruby-Objekten, die == und eql? unterschiedlich definieren.

RSpec 2.0 hat diese Gleichheit Matcher in rspec-Erwartungen:

a.should equal(b) # passes if a.equal?(b) 
a.should eql(b) # passes if a.eql?(b) 
a.should == b # passes if a == b 

RSpec hat auch zwei Gleichheit Matcher soll eher ein DSL haben, um ihnen das Gefühl:

a.should be(b) # passes if a.equal?(b) 
a.should eq(b) # passes if a == b 

In Ihrem Beispiel Sie Erstelle einen Datensatz und finde ihn dann.

So haben Sie zwei Möglichkeiten zum Testen #find_by_name:

  • Um zu testen, ob es genau das gleiche Objekt OR eine äquivalente Person Datensatz mit der gleichen ID abruft, dann verwenden should == oder dessen Äquivalent a.should eql oder sein DSL Version should eq

  • Um zu testen, ob es genau die gleiche Objekt NICHT eine äquivalente Person Aufzeichnung mit der gleichen ID verwendet, dannverwendenoder seine DSL-Version should be

+1

'==' und 'eql' sind nicht äquivalent:' 2 == 2.0 und nicht 2.eql? 2.0' – aaronsw

+0

Danke Aaron, guter Punkt. Ich aktualisiere die Antwort, um zu verdeutlichen, dass ActiveRecord :: Base sie äquivalent macht, was sich von Rubys typischer Verwendung unterscheidet. – joelparkerhenderson

+0

Danke @joelparkerhenderson. Dies ist der nützlichste Überblick über die Ruby-Gleichheit, die ich gesehen habe. –

Verwandte Themen