簡體   English   中英

相關(belongs_to)關系的RSpec存根和模擬

[英]RSpec stubs & mocks on related (belongs_to) relationships

我試圖通過嘗試擴展由Rails 3腳手架生成的默認規范來使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上遇到了麻煩。 因為當我引用小丑時,這些規格失敗了。 用兔子的觀點之一命名 愚蠢的簡單應用程序可以按預期工作,但規格失敗,因為我沒有對小丑進行own打(或嘲笑?)來正確響應兔子(或者至少我認為這是正在發生的事情)?!? 我應該如何添加存根(或嘲笑與兔子相關的小丑?)。

現有:

   #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

  ...

恕我直言(還有其他觀點),這不是嘲笑或存根。 小樣和存根非常適合外部依賴項(例如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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM