I have a helper method to return error messages under the corresponding field in my form. In the browser it works as expected and displays the error message if there is one, but the spec for the helper is failling.
What am I missing?
# _form.html.haml
= form_for [:admin, @partner] do |f|
= f.select :trader_id, options_for_select(@traders.map { |trader| [trader.company_name, trader.id] }, selected: @partner.trader_id), {}, class: 'form-control form-control-sm'
= error_message(@partner, :trader)
# errors_helper.rb
def error_message(object, field)
return unless object.errors[:"#{field}"]
content_tag :div do
object.errors[:"#{field}"].each do |msg|
concat content_tag(:small, msg, class: 'text-danger')
end
end
end
#errors_helper_spec.rb
require 'rails_helper'
RSpec.describe ErrorsHelper do
describe '#error_message' do
it 'returns an error message' do
object = build(:trader, company_name: nil)
expect(helper.error_message(object, object.company_name)).to have_content('moet ingevuld zijn')
end
end
end
Running this specs tells me:
expected to find text "moet ingevuld zijn" in ""
object.company_name
returns the company name.
You want the name of the column, not the value of the column
so instead of...
expect(helper.error_message(object, object.company_name)).to have_content('moet ingevuld zijn')
use...
expect(helper.error_message(object, 'company_name')).to have_content('moet ingevuld zijn')
Also, you need to invoke the validations to check the error messages...
object = build(:trader, company_name: nil)
object.valid?
expect(helper.error_message(object, 'company_name')).to have_content('moet ingevuld zijn')