Search code examples
ruby-on-railsminitest

Rails Minitest for polymorphism


A class was generated with associable:references{polymorphic}
Thus the schema has:

    t.string "associable_type", null: false
    t.bigint "associable_id", null: false

The fixtures auto-generated by rails have:

  associable: one
  associable_type: Associable

There was an attempt to modify the fixtures to reflect the schema:

  associable_id: 4
  associable_type: Chain

The following test

  test "valid " do
    contact = Contact.new(associable_id: 2, associable_type: 'User')
puts contact.valid?
puts contact.errors.inspect
    assert contact.valid?
  end

returns

false
#<ActiveModel::Errors [#<ActiveModel::Error attribute=associable, type=blank, options={:message=>:required}>]>

Changing the test to contact = Contact.new(associable: two, associable_type: 'User') complains with NameError: undefined local variable or method 'two' as per the autogenerated syntax

How can polymorphic records be properly tested?


Solution

  • Fixtures are data which are created and that you can test against. We can refer https://api.rubyonrails.org/classes/ActiveRecord/FixtureSet.html for detail understanding. In our case we don't need to modify the fixtures.

    The error which we are getting in our test case is because we haven't created record in users table. So when it tries to validate the record it check whether the record with mentioned id associable_id: 2 (i.e 2 in our case) is present in users table or not.

    You can modify test case as below

    test "valid " do
      user = User.new(name: 'Jerome', email: '[email protected]')
      user.save
      Contact.new(associable: user)
      puts contact.valid?
      puts contact.errors.inspect
      assert contact.valid?
    end
    

    Note: I haven't add other columns as i am not aware of your users and contacts schema. Please add columns if there are any.