[英]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.