2009-08-22 21 views
0

私は別のオブジェクトに渡されているオブジェクトを模擬しようとしていますが、成功していません。私が間違っていることを誰かに見せてもらえますか?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

、私はあなたがやろうとしていると思うが、これは

it '...' do 
    some_fetcher = Fetcher.new 
    some_fetcher.should_receive(:download).and_return(6) 

    f = Reports.new(some_fetcher) 
    f.status.should == 6 
end 

あなたがFetcher.should_receiveを言うとき(と思う)で、あなたはCLASSが受け取るべき言っていますクラスのインスタンスの代わりに 'ダウンロード'を呼び出してください。

これが役に立ちます。それが明確でない場合は、私に知らせてください!

+0

ありがとうございました。しかし....二つのこと。 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 彼のクラスの修正はなぜ機能するのですか? –

+0

#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

0

新しい構文に基づいて更新されました。

subject(:reports) { described_class.new(fetcher) } 
let(:fetcher}  { double("Fetcher") } 

describe "#status" do 
    it "gets status of 6" do 
    fetcher.stub(download: 6) 
    expect(reports.status).to == 6 
    end 
end