Search code examples
ruby-on-railsrspec-rails

RSpec helper spec fails but works in browser


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 ""

Solution

  • 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')