2013-06-19 37 views
0

我有一組模型(說MODELA,ModelB,ModelC ....),這都需要有相關的部分。即:RSpec的:測試是否與模型相關的部分呈現

的意見/ model_as/_model_a.xml.haml
的意見/ model_bs/_model_b.xml.haml
的意見/ model_cs/_model_c.xml.haml ...

這樣的一個實例這些模型可以呈現爲XML ...

model_a = ModelA.last 
render model_a 

我已經爲每個模型一個共享的測試,所以我可以叫

it_behaves_like 'group model', ModelA.new 

從我的模型規格,以測試這些模型的其他共享功能。

我想要寫一個規範

it 'should render as xml' 

,並把它放在 shared_examples_for「組模式」

我意識到這是混合視圖規格與型號規格,這似乎喜歡它的一個壞主意。另一方面,我正在測試與每個模型相關的東西,而不是某個特定的視圖模板。

我的問題:

  • 這是一個壞主意?
  • 如果它不是一個壞主意,我該如何創建這個測試? render model_a拋出一個未定義的方法`渲染'錯誤。
  • 如果這是一個壞主意,你會在哪裏把這些測試?

回答

0

我已經決定這的確是一個壞主意。最後我將它移到了視圖規範中。

最終,這樣做更有意義,不僅因爲它在視圖規範中正確對待了視圖,而且還因爲它允許我在一個地方檢查模型的所有渲染特性 - 而不是通過一堆模型規範。

現在我已經完成了它,但我不確定爲什麼這個路徑從一開始就不明顯,但是隻要有人問自己同樣的問題,我會在我的初始實現中粘貼一個例子:

規格/視圖/ angelxml/angel_views_spec.rb

require 'spec_helper' 

module Angelxml 
    describe "angel views" do 
    it_behaves_like 'angel view', Message.new 
    it_behaves_like 'angel view', Question.new 
    it_behaves_like 'angel view', Transfer.new 
    it_behaves_like 'angel view', Voicemail.new 

    it_behaves_like 'angel view', AngelAction.new, "action" 
    it_behaves_like 'angel view', CcExp.new, "ccexp" 
    it_behaves_like 'angel view', Comment.new 
    it_behaves_like 'angel view', CreditCard.new, "creditcard" 
    it_behaves_like 'angel view', Currency.new, nil, true 
    it_behaves_like 'angel view', Date.new, nil, true 
    it_behaves_like 'angel view', ErrorStrategy.new 
    it_behaves_like 'angel view', Goto.new, nil, true 
    it_behaves_like 'angel view', Invalid.new, nil, true 
    it_behaves_like 'angel view', Keyword.new 
    it_behaves_like 'angel view', Link.new, nil, true 
    it_behaves_like 'angel view', NoLink.new, "no" 
    it_behaves_like 'angel view', Number.new 
    it_behaves_like 'angel view', Play.new 
    it_behaves_like 'angel view', Prompt.new 
    it_behaves_like 'angel view', Response.new 
    it_behaves_like 'angel view', Time.new, nil, true 
    it_behaves_like 'angel view', Valid.new 
    it_behaves_like 'angel view', Var.new, nil, true 
    it_behaves_like 'angel view', VariableList.new, "variables" 
    it_behaves_like 'angel view', YesLink.new, "yes" 
    it_behaves_like 'angel view', YesNo.new 
    end 
end 

規格/支持/ shared_examples_for_angel_view

shared_examples_for 'angel view' do |angel_model,node_name,no_close_tag| 

    it 'model should render as xml' do 
    model_name = angel_model.class.name.demodulize 
    model = FactoryGirl.build(model_name.underscore.to_sym) 
    node_name = model_name if node_name.nil? 
    node_name = node_name.upcase 

    render model 
    response.body.should include("<"+node_name) 
    response.body.should include("</"+node_name+">") unless no_close_tag 
    end 

end