我创建了一个FormBuilder扩展:
form.div_field_with_label(:email)其中产出:
<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
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
endspec/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, 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发布于 2013-10-28 07:30:18
实际上,它和使用self一样简单,因为FormBuilder在继承链中有TagHelper。
# 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发布于 2014-02-27 15:11:03
rails 3或更高版本的更新。
现在应该是这样的:
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发布于 2013-10-28 06:44:07
我还没有尝试过这种方法,但是看看GroundedFormBuilder是如何使用@template的,也许您所需要的只是一个扩展ActionView::Helpers::TagHelper的对象
# ...
template = Object.new.extend ActionView::Helpers::TagHelper
# ...任何TagHelper方法(如content_tag )都应该生成与实际模板中包含的内容相同的内容。
https://stackoverflow.com/questions/19628063
复制相似问题