Rails の FormBuilder をテストしようと思ったら new にわたす template をどうすればいいかわからず困った

Rails の FormBuilder をテストしようと思ったら new にわたす template をどうすればいいかわからず困った

view 内の form_for から instantiate_builder を経てこういう形で呼びだされます。

builder.new(object_name, object, self, options)

self is 何?かというと view から呼びだされるのでもちろん view ですが、FormBuilder 対象のテストなので view なんてありません。ので用意します。

class TestHelper < ActionView::Base; end

あとはいい感じにインスタンスを作成してメソッドを呼べば HTML が返ってきました。

require 'rails_helper'

class TestHelper < ActionView::Base; end

RSpec.describe WritingErrorFormBuilder::Builder do
  before :each do
    @test_model = build(:test_model)
    @f = WritingErrorFormBuilder::Builder.new(:test_model, @test_model, TestHelper.new, {})
  end

  context 'text_field' do
    it 'not validated no error' do
      expect(@f.text_field(:text)).not_to have_tag('ul.errors.text')
    end

    it 'validated get error' do
      @test_model.valid?
      expect(@f.text_field(:text)).to have_tag('ul.errors.text')
    end
  end
end