RSpec:测试部分与模型渲染相关联

时间:2013-06-19 16:22:44

标签: ruby-on-rails-3 rspec

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

视图/ model_as / _model_a.xml.haml
视图/ model_bs / _model_b.xml.haml
views / 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抛出未定义的方法`render'错误。
  • 如果这是一个坏主意,你会把这些测试放在哪里?

1 个答案:

答案 0 :(得分: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