私は別のオブジェクトに渡されているオブジェクトを模擬しようとしていますが、成功していません。私が間違っていることを誰かに見せてもらえますか?rspec模擬質問
class Fetcher
def download
return 3
end
end
class Reports
def initialize(fetcher)
@fetcher = fetcher
end
def status
@fetcher.download
end
end
describe Reports do
before(:each) do
end
it "should get get status of 6" do
Fetcher.should_receive(:download).and_return(6)
f = Reports.new(Fetcher.new)
f.status.should == 6
end
end
スペックは、まだ確かに、私はここで何かをしないのです、私の6
意図していない、3を返す状況を報告します。何かご意見は? (:ダウンロード)
試験で
ありがとうございました。しかし....二つのこと。 1. Fetcherのインスタンスがクラスに変更を継承しないのはなぜですか? Fetcherに新しいメソッドを追加してインスタンス化した場合、そのメソッドはありますか? 2. rspecのPeepcodeスクリーンキャストから上記のコードに到着しました。元のコードはRailsモデル用で、次のようになっていました: def mock_feed(zipcode、how_many = 1) xml = ... Weather.should_receive(:open).exactly(how_many) with( "http://weather.yahooapis.com/forecastrss?p=#{zipcode}")。 and_return(xml) end 彼のクラスの修正はなぜ機能するのですか? –
#1の場合、そうすることができますが、適切なタイミングで2番目のクラスをインスタンス化することが保証されていない場合は、簡単に問題が発生します。記述した方法で新しいメソッドを定義するのではなく、 'instance_eval'を試してみてください。 あなたはフレッチャーにメソッドを追加したいのであれば、あなたができる: Fletcher.class_evalは defのいくつか他の人は私ができるよりも、この優れた説明 ... エンド の端をsome_methodありません。ここにいくつかのリンクがあります: http://bmorearty.wordpress.com/2009/01/09/fun-with-rubys-instance_eval-and-class_eval/ #2、私はかなり問題を作り出すことができませんでした。もう一度やり直せますか? – btelles