2010-12-02 10 views
0

Rails 3の足場で生成されたデフォルトの仕様を拡張しようとRSpecの信じられないほど紛らわしい、少なくとも最初の構文を頭に入れようとしています...関連する(belongs_to)関係のRSpecスタブとモック

非常に単純

I関連しているモデル...:

#clown.rb 
class Clown < ActiveRecord::Base 
    has_many :rabbits 
end 

#rabbit.rb 
class Rabbit < ActiveRecord::Base 
    belongs_to :clown 
end 

が、私はrabbits_controller.spec.rbとのトラブルを抱えています。というのも、私がクラウンを参照すると、仕様が失敗するということです。 名前ウサギの意見の1つ。愚かなシンプルなアプリは期待どおりに動作しますが、私はウサギから正確に対応するために(または少なくとも私が起こっていると思うことですが)ピエロをスタブしていない(または嘲笑していない)ため、スペックは失敗します。スタブを追加するにはどうすればいいですか(または、ウサギが関連しているかっこを嘲笑していますか?)。

既存:

#rabbits.controller.spec.rb 
    require 'spec_helper' 

    describe RabbitsController do 

     def mock_rabbit(stubs={}) 
     (@mock_rabbit ||= mock_model(Rabbit).as_null_object).tap do |rabbit| 
      rabbit.stub(stubs) unless stubs.empty? 
     end 
     end 

     describe "GET index" do 
     it "assigns all rabbits as @rabbits" do 
      Rabbit.stub(:all) { [mock_rabbit] } 
      get :index 
      assigns(:rabbits).should eq([mock_rabbit]) 
     end 
     end 

    ... 

答えて

1

私見を(ビューの他の点がある)、これはモックやスタブ状況ではありません。モックとスタブは外部依存(Webサービスと考える)には最適ですが、これはアプリケーションの内部にあります。あなたが望むのは、factory_girlのようなものです。これは、フィクスチャーのような頭痛のないテストデータを作成したり、すべての従属関係を模倣しようとするもので、単調に変化します。 factory_girlは偉大なドキュメントを持っていますが、ここで簡単にあなたの工場がどのように見えるかです:まあ、これは学習誰かにさらに混乱なる

describe RabbitsController do 
    describe "GET index" do 
    it "assigns rabbits" do 
     @rabbit = Factory(:rabbit) 
     get :index 
     assigns[:rabbits].should == [@rabbit]  
    end 
    end 
end 
+0

Factory.define(:clown) do |f| f.rabbits{|c| [c.assocation(:rabbit)]} f.name "Pierrot" end Factory.define(:rabbit) do |f| f.association :clown end 

あなたはそのようにように、あなたのテストでそれらを使用したいですなぜRails3/RSpecテンプレートに 'mock_rabbit'ブロックがデフォルトとして含まれていますか?私のような人から地獄を混乱させるだけですか?私は実際に知っていることが少ないほどRailsについて学ぶほど多くのことを学んでいます... – Meltemi

+0

私には分かりません:)おそらく彼らは私が知らないいくつかのトリックを持っていますが、宗教的にテストする人としては、私の内部の依存関係のための工場で。しばらくの間、あなたのテストをデータベース接続から独立させることを訴えている人がたくさんいましたが、時間がたつにつれてPITAのようなものになってきて、アプリケーションテストに焦点を当てるよりも、 – karmajunkie

関連する問題