hatte ich eine Methode in einem Modell:Wie kann man die Callback-Methode des Modells unabhängig testen?
class Article < ActiveRecord::Base
def do_something
end
end
ich auch einen Komponententest für diese Methode hatte:
# spec/models/article_spec.rb
describe "#do_something" do
@article = FactoryGirl.create(:article)
it "should work as expected" do
@article.do_something
expect(@article).to have_something
end
# ...several other examples for different cases
end
Alles war gut, bis ich es besser gefunden diese Methode in einen after_save
Rückruf bewegen :
class Article < ActiveRecord::Base
after_save :do_something
def do_something
end
end
Jetzt alle meine Tests über diese Methode gebrochen. Ich habe es beheben von:
- Keine spezifischen Aufruf
do_something
weilcreate
odersave
wird diese Methode auch auslösen, oder ich werde doppelte db Aktionen treffen. - ändern
create
zubuild
- -Test respond_to
Verwenden allgemeinen
model.save
anstelle einzelner Methodenaufrufmodel.do_something
describe "#do_something" do @article = FactoryGirl.build(:article) it "should work as expected" do expect{@article.save}.not_to raise_error expect(@article).to have_something expect(@article).to respond_to(:do_something) end end
Der Test bestanden, aber meine Sorge ist es nicht mehr geht um die spezifische Methode. Der Effekt wird gemischt mit anderen Rückrufen sein, wenn mehr hinzugefügt.
Meine Frage ist, gibt es eine schöne Art und Weise Instanzmethoden des Modells unabhängig zu testen, ob ein Rückruf zu werden?
Es ist nicht klar, warum Ihr ursprünglicher Ansatz noch nicht für die Prüfung arbeiten. Unit testet die Methode direkt und testet einfach, dass sie als Callback unabhängig aufgerufen wird. Fehle ich etwas oder gibt es etwas, das dir an diesem Ansatz nicht gefällt? –
@AndrewHubbs, danke für deine Frage. Der Grund ist diese geänderte Methode db. Zum Beispiel wird dieser Artikel der Kategorie "Rails" zugewiesen. Nach dem Refacoring auf Callback, wenn ich FactoryGirl.create aufrufe, wird dieser Callback wirksam und Artikel der Kategorie "Rails" zuweisen. Wenn ich diese Methode innerhalb des Tests erneut aufrufe, wird ein Fehler angezeigt, da sie bereits zugewiesen ist. –