0

Rails 3 の scaffolding で生成されるデフォルトの仕様を拡張しようとすることで、RSpec の信じられないほど紛らわしい構文について、少なくとも最初は理解しようとしています...

私はモデルを関連付けています...非常に単純です:

#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

  ...
4

1 に答える 1

1

私見(そして他の観点もあります)これは嘲笑やスタブの状況ではありません。モックとスタブは外部の依存関係 (Web サービスを考えてください) には最適ですが、これはアプリケーションの内部的なものです。あなたが望むのは factory_girl のようなものです。これにより、フィクスチャのような頭痛の種や、すぐに単調になるすべての依存関係を模倣しようとすることなく、テスト データを作成できます。factory_girl には優れたドキュメントがありますが、工場がどのように見えるかを簡単に示します。

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

Factory.define(:rabbit) do |f|
  f.association :clown
end

次に、次のようにテストでそれらを使用します。

describe RabbitsController do 
  describe "GET index" do 
    it "assigns rabbits" do
      @rabbit = Factory(:rabbit)
      get :index
      assigns[:rabbits].should == [@rabbit]      
    end
  end
end
于 2010-12-02T22:44:20.410 に答える