在rails 2.3+中测试(rspec)嵌套模型部分

Posted

技术标签:

【中文标题】在rails 2.3+中测试(rspec)嵌套模型部分【英文标题】:testing (rspec) nested model partials in rails 2.3+ 【发布时间】:2009-12-25 21:40:16 【问题描述】:

使用嵌套模型的 2.3.x+ rails 功能,我认为我需要访问表单构建器实例来正确指定用于渲染嵌套模型的部分。从复杂形式示例中提取:

例如,这是一个封闭的表单,它创建表单构建器并将其传递给嵌套模型渲染视图:

<div class="children_fields tasks" id="<%= dom_id(f.object) %>_tasks"  
   data-context="<%= f.object_name %>">
  <% f.fields_for :tasks do |task_form| %>
    <%= render :partial => 'task', :locals =>  :f => task_form  %>
  <% end %>    
</div>

任务部分是:

<%= f.label :name, "Task" %>
<%= f.text_field :name %>
<%= remove_child_link "remove", '#', f %>
<div class="children_fields assignments" id="<%= dom_id(f.object) %>_assignments"  
     data-context="<%= f.object_name %>">
  <% f.fields_for :assignments do |assignment_form| %>
    <%= render :partial => 'assignment', :locals =>  :f => assignment_form  %>
  <% end %>
</div>

当我尝试像这样指定部分时,我尝试通过执行以下操作将表单构建器捕获为实例变量:

before(:each) do
  ... # setup for target object
  form_for [:foo, :bar, @project] do |f|
    @f = f
  end
end

这会在使用 form_for 时引发错误

undefined method `polymorphic_path' for #<Spec::Rails::Example::ViewExampleGroup::Subclass_1:0x2cfeafc>
/Users/adamaig/.rvm/gems/ruby/1.8.7/gems/actionpack-2.3.5/lib/action_controller/test_process.rb:511:in `method_missing'
/Users/adamaig/.rvm/gems/ruby/1.8.7/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:298:in `apply_form_for_options!'
/Users/adamaig/.rvm/gems/ruby/1.8.7/gems/actionpack-2.3.5/lib/action_view/helpers/form_helper.rb:272:in `form_for'

那么,正确的方法是: 1) 为这样的规格获取 FormBuilder 实例? 2) 规范嵌套模型及其视图形式?

这对于正确的名称生成很重要。

【问题讨论】:

你应该接受 pr0d1r2 的回答,它对我很有用。 【参考方案1】:

解决办法是:

describe 'tasks/_form' do
  attr_accessor :output_buffer

  before do
    task = mock_model(Task, :mumbo_jumbo => 'foo bar')
    @output_buffer = ''
    form_for(task, :url => task_path(task)) do |f|
      @f = f
    end
  end

  it 'should have input mumbo_jumbo' do
    render_partial_with_locals
    response.should have_tag('input[name=?]', 'task[mumbo_jumbo]')
  end

  private

    def render_partial_with_locals
      render :partial => 'tasks/form', :locals => :f => @f
    end

    def protect_against_forgery?
      false
    end
end

【讨论】:

以上是关于在rails 2.3+中测试(rspec)嵌套模型部分的主要内容,如果未能解决你的问题,请参考以下文章

Circle CI 上的 Rspec 测试失败(Ruby on Rails 5.2.3)

Rails 3.1,RSpec:测试模型验证

使用 RSpec 为带有 Rails 的 Redis 编写测试

Rails, Restful Authentication & RSpec - 如何测试需要身份验证的新模型

如何使用 RSpec 在 Rails 中测试:包含验证

ruby Rails Rspec模型使用rspec-rails,shoulda-matcher,shoulda-callbacks和factory_girl_rails测试骨架和备忘单。差不多