2 Stimmen

Ist es legal, die #class-Methode eines Mock-Objekts zu stubben, wenn RSpec in einer Ruby on Rails-Anwendung verwendet wird?

Ich möchte die #class-Methode eines Mock-Objekts stubben:

describe Letter do
  before(:each) do
    @john = mock("John")
    @john.stub!(:id).and_return(5)
    @john.stub!(:class).and_return(Person)  # is this ok?
    @john.stub!(:name).and_return("John F.")
    Person.stub!(:find).and_return(@john)
  end
  it.should "have a valid #to field" do
    letter = Letter.create!(:to=>@john, :content => "Hello John")
    letter.to_type.should == @john.class.name
    letter.to_id.should == @john.id
  end
  [...]
end

In Zeile 5 dieses Programms stubbe ich die Methode #class, um Dinge wie @john.class.name zu ermöglichen. Ist das der richtige Weg? Wird es irgendwelche negativen Nebenwirkungen geben?

Bearbeiten:

Die Klasse Letter sieht wie folgt aus:

class Letter < ActiveRecord::Base
    belongs_to :to, :polymorphic => true
    [...]
end

Ich frage mich, ob ActiveRecord den Klassennamen des :to-Feldes mit to.class.name oder mit anderen Mitteln. Vielleicht ist das der Zweck der class_name Methode von ActiveRecord::Base?

3voto

Étienne Barrié Punkte 1478

Ich denke, Sie sollten Folgendes verwenden mock_model für diesen speziellen Fall. Ihr before(:each) so aussehen würde:

before(:each) do
  @john = mock_model(Person, :name => "John F.")
  Person.stub!(:find).and_return(@john)
end

Dann für Ihre andere Frage, sollten Sie nicht wirklich kümmern, wie Rails funktioniert, um Ihr Verhalten zu testen. Ich denke nicht, dass es eine gute Idee ist, to_type und to_id Felder selbst zu testen. Dies ist das Verhalten von Rails und sollte daher in Rails getestet werden, nicht in Ihrem Projekt.

Ich habe mit Bemerkenswert für eine Weile und es macht dies wirklich einfach zu spezifizieren:

describe Letter
  should_belong_to :to, :polymorphic => true
end

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X