首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >测试Rails FormBuilder扩展

测试Rails FormBuilder扩展
EN

Stack Overflow用户
提问于 2013-10-28 06:00:59
回答 3查看 2.2K关注 0票数 4

我创建了一个FormBuilder扩展:

代码语言:javascript
复制
form.div_field_with_label(:email)

其中产出:

代码语言:javascript
复制
<div class="field email">
    <label for="user_email">Email</label>
    <input class="input" id="user_email" name="user[email]" type="email" value="">
</div>

如何在rspec测试中创建或模拟模板对象?

app/helper/form_helper.rb

代码语言:javascript
复制
module FormHelper

  class GroundedFormBuilder < ActionView::Helpers::FormBuilder

    def div_field_with_label(key, &block)

      if block_given?
        content = self.label(key)
        content << block.call(key)
      end
      classes = ['field']
      classes << key.to_s
      if @object.errors[key].size != 0
        classes << 'warning'
        msg = @object.errors.full_message(key, @object.errors[key].join(', '))
        content << @template.content_tag(:p, msg, :class => "error-message warning alert" )
      end
      @template.content_tag(:div, content, :class => classes.join(' ').html_safe)
    end
  end
end

spec/helper/form_helper_spec.rb

代码语言:javascript
复制
require 'spec_helper'

describe FormHelper do

  describe FormHelper::GroundedFormBuilder do

    describe 'div_field_with_label' do

      # how do i create or mock template?
      # template = ?
      let(:resource)  { FactoryGirl.create :user }
      let(:helper)    { FormHelper::GroundedFormBuilder.new(:user, resource, template, {})}
      let(:output)    { helper.div_field_with_label :email }

      it 'wraps input and label' do
        expect(output).to match /<div class="field">/
      end

      it 'creates a label' do
        expect(output).to match /<label for="user[email]">Email/
      end
    end
  end
end
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-10-28 07:30:18

实际上,它和使用self一样简单,因为FormBuilder在继承链中有TagHelper

代码语言:javascript
复制
# spec/helper/form_helper_spec.rb
require 'spec_helper'

describe FormHelper do

  describe FormHelper::GroundedFormBuilder do

    describe 'div_field_with_label' do

      # how do i create or mock template?
      # template = ?
      let(:resource)  { FactoryGirl.create :user }
      let(:helper)    { FormHelper::GroundedFormBuilder.new(:user, resource, self, {})}
      let(:output)    {
        helper.div_field_with_label :email do
          helper.email_field(:email, :class => 'input')
        end
      }

      it 'wraps input and label' do
        expect(output).to include '<div class="field email">'
      end

      it 'creates a label' do
        expect(output).to include '<label'
      end
    end
  end
end
票数 0
EN

Stack Overflow用户

发布于 2014-02-27 15:11:03

rails 3或更高版本的更新。

现在应该是这样的:

代码语言:javascript
复制
require 'spec_helper'

class TestHelper < ActionView::Base; end

describe LabeledFormBuilder do
  describe '#upload_tag' do
    let(:helper) { TestHelper.new }
    let(:resource)  { FactoryGirl.build :user }
    let(:builder) { LabeledFormBuilder.new :user, resource, helper, {}, nil }
    let(:output) do
      builder.upload_tag :avatar, title: "Test upload"
    end
    before { expect(helper).to receive(:render) { "render partial "} }

    it { expect(output).to include "<a href=\"#avatar-upload-modal\" class=\"btn\" data-toggle=\"modal\" role=\"button\">Upload file via new solution</a>" }
  end
end
票数 5
EN

Stack Overflow用户

发布于 2013-10-28 06:44:07

我还没有尝试过这种方法,但是看看GroundedFormBuilder是如何使用@template的,也许您所需要的只是一个扩展ActionView::Helpers::TagHelper的对象

代码语言:javascript
复制
# ...
template = Object.new.extend ActionView::Helpers::TagHelper
# ...

任何TagHelper方法(如content_tag )都应该生成与实际模板中包含的内容相同的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19628063

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档