0

我有一组模型(比如 ModelA、ModelB、ModelC....),它们都需要有一个关联的部分。即:

视图/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 'group model'

我意识到这是将视图规范与模型规范混合在一起,这似乎是个坏主意。另一方面,我正在测试与每个模型相关的东西,而不是某些特定的视图模板。

我的问题:

  • 这是一个坏主意吗?
  • 如果它不是一个坏主意,我该如何创建这个测试? render model_a引发未定义的方法“渲染”错误。
  • 如果这是一个坏主意,您会将这些测试放在哪里?
4

1 回答 1

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
于 2013-06-20T18:40:02.257 回答