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
Auf welche zwei verschiedenen Objekte beziehen Sie sich? – jtbandes
@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? –
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