Ruby on rails 3 RSpec:测试部分是否与模型渲染关联

Ruby on rails 3 RSpec:测试部分是否与模型渲染关联,ruby-on-rails-3,rspec,Ruby On Rails 3,Rspec,我有一组模型(比如ModelA、ModelB、ModelC……),它们都需要有一个关联的分部。即: views/model_as/_model_a.xml.haml views/model_bs/_model_b.xml.haml 视图/model\u cs/\u model\u c.xml.haml 因此,这些模型的实例可以呈现为xml model_a = ModelA.last render model_a 我已经对每个模型进行了共享测试,因此我可以调用 it_behaves_like

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

views/model_as/_model_a.xml.haml
views/model_bs/_model_b.xml.haml
视图/model\u cs/\u model\u c.xml.haml

因此,这些模型的实例可以呈现为xml

model_a = ModelA.last
render model_a  
我已经对每个模型进行了共享测试,因此我可以调用

it_behaves_like 'group model', ModelA.new 
从我的模型规范中,测试这些模型的其他共享功能

我想写一份说明书

it 'should render as xml'
并将其放入“组模型”的共享示例中

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

我的问题是:

  • 这是个坏主意吗
  • 如果这不是一个坏主意,我如何创建这个测试<代码>渲染模型_a引发未定义的方法“渲染”错误
  • 如果这是个坏主意,你会把这些测试放在哪里

    • 我认为这的确是个坏主意。最后,我将其移动到视图等级库

      最终,这更有意义,不仅因为它在视图规范中正确地处理了视图,还因为它允许我在一个位置检查模型的所有渲染功能,而不是通过一堆模型规范分散开来

      现在我已经完成了,我不确定为什么这条路径从一开始就不明显,但只是为了防止其他人问自己同样的问题,我将粘贴在我的初始实现中作为一个示例:

      等级库/视图/angelxml/angel\u视图\u等级库.rb 规格/支持/共享\u示例\u用于\u天使\u视图 “天使视图”do的共享示例天使模型、节点名称、无关闭标记| 它的“模型应该以xml的形式呈现” model\u name=angel\u model.class.name.demodulize model=FactoryGirl.build(model_name.下划线.to_sym) 如果node_name.nil,node_name=model_name? node_name=node_name.upcase 渲染模型 response.body.应包括(“
      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' 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