Frage

Ich bin mit Mokka und Factory_girl in einem JRuby Schienen Anwendung. Als ich das Werk nennen würde Ich mag die Objekte mit etwas spöttisch zurückzukehren bereits getan. Hier ist ein Code-Schnipsel von dem, was ich zu tun versuchen.

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
  t.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
end

Weil ich nicht meine Einheit wollen und Funktionstest, um tatsächlich von der Twitter-API ziehen möchte ich die Methode Stummel so kehrt, was ich will. Aber das funktioniert nicht. Das Objekt kommt wieder ohne Anstoßen getan. Gibt es eine Möglichkeit tatsächlich auf ein Objekt mit Fabrik Mädchen erstellt durchgeführt haben Anstoßen, bevor es an Sie zurückgeschickt wird?

War es hilfreich?

Lösung

Mit Blick auf die Dokumentation und Quellcode für factory_girl, sieht es aus wie das Objekt auf den Block ergab (t, in Ihrem Beispiel) eine Instanz eines Factory ist und nicht eine Instanz des Objekts, das Sie (die tweet_feed_with_tweets bauen wollen, in Ihrem Beispiel). Dies bedeutet, dass für die pull_tweets Methode auf t eine Erwartung Einstellung wird die Erwartung auf der Factory Instanz setzen und nicht auf dem Objekt, das aufgebaut wird, wenn Sie Factory(:tweet_feed_with_tweets) nennen. Ich denke, das erklärt, warum Ihr Beispiel funktioniert nicht wie erwartet.

ich kann mich irren, aber ich kann einen Weg der Zugabe der Erwartung im Factory.define Block nicht sehen. Sie haben wahrscheinlich schon daran gedacht, aber ich denke, Sie besser dran Zugabe im Test die Erwartung sein würde, nachdem Sie die Instanz aufgebaut haben: -

def test_should_do_something
  tweet_feed = Factory(:tweet_feed)
  tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
  # test stuff here
end

Wenn Sie dies an mehreren Stellen benötigen, können Sie es in ein Verfahren extrahieren: -

def test_should_do_something
  tweet_feed = build_tweet_feed_with_tweets
  # test stuff here
end

private

def build_tweet_feed_with_tweets
  tweet_feed = Factory(:tweet_feed)
  tweet_feed.expects(:pull_tweets).returns([Factory.build(:status), Factory.build(:status)])
  return tweet_feed
end

Ein paar andere Gedanken: -

  1. Ich denke, die Erwartungen in solchen versteckten Platz Einstellung ist wahrscheinlich eine schlechte Idee sowieso.
  2. Wenn Sie es tun wollen, hätte ich gedacht stubs mit war besser geeignet als expects.
  3. Es könnte sein, lohnt sich die pull_tweets Methode (und alle ähnlichen Methoden) in eine TwitterAPI Klasse zu trennen. Auf diese Weise ist es nicht so schlimm scheinen würde, dass Sie brauchen eine Erwartung auf der TwitterAPI im Test einzurichten.

Ich hoffe, einige von dem hilft.

Andere Tipps

Rückrufe sind jetzt verfügbar:

Factory.define :tweet_feed_with_tweets, :parent => :tweet_feed do |t|
  t.after_build do |tt|  
    tt.expects(:pull_tweets).returns([Factory.build(:status),Factory.build(:status)])
  end
end
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top