3

I'm pretty confused about an error I get trying to unit test a model (User) I have. I have a fixture for the model in test/fixtures/users.yml

new_user_in_unavailable_country:
  first_name: John
  last_name: Lennon
  email: john.lennon@pop.co.uk
  password: YokoOn0
  country: UNITED KINGDOM

Now in test/unit/user_test.rb I have

require 'test_helper'

class UserTest < ActiveSupport::TestCase
  test "status_auto_fill_for_unavailable_country" do
     users(:new_user_in_unavailable_country).valid?
     assert users(:new_user_in_unavailable_country).status == "SUBSCRIBED"
  end
end

So far so good. Now, here is what that generates upon rake:test:units :

 Error:
test_status_auto_fill_for_available_country(UserTest):
ActiveRecord::StatementInvalid: Mysql2::Error: Field 'name' doesn't have a default value: INSERT INTO `countries` (`id`) VALUES (980190962)

Okay, if there is an hidden insert somewhere into table countries (which I never asked for!), I should be able to see that upon running the same code in a rails console. So I tried:

> usr = User.new(:first_name => "John", :last_name => "Lennon", :email => "john.lennon@pop.co.uk", :password => "YokoOn0", :country => "UNITED KINGDOM")
#<User id: nil, first_name: "John", last_name: "Lennon", email: "john.lennon@pop.co.uk", hashed_password: nil, password_salt: nil, created_at: nil, updated_at: nil, organization_id: nil, country: "UNITED KINGDOM", status: nil>

>> usr.valid?
   (1.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (1.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (0.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (1.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (0.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (0.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (0.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (0.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
   (0.0ms)  SELECT COUNT(*) FROM `countries` WHERE `countries`.`available` = 1 AND `countries`.`name` = 'UNITED KINGDOM'
  User Exists (1.0ms)  SELECT 1 FROM `users` WHERE `users`.`email` = BINARY 'john.lennon@pop.co.uk' LIMIT 1
true

>> usr.status
"SUBSCRIBED"

Okay, no insertion into countries table.

Anyidea of what happens behind the scene that I am missing and that generates this error?

Create Country migration:
class CreateCountries < ActiveRecord::Migration
  def change
     create_table :countries do |t|
      t.string      :name , :null => false
      t.string      :iso_2_letters_code , :null => false
      t.string      :iso_3_letters_code , :null => false
      t.integer     :phone_code
    end

    add_index :countries , :iso_2_letters_code , :unique => true
    add_index :countries , :iso_3_letters_code , :unique => true
  end
end
muichkine
  • 2,890
  • 2
  • 26
  • 36
  • Can you share your migration file for `Country`? Looks like you have a `NOT NULL` constraint on the `name` column in `countries` table. – Swanand Aug 21 '12 at 11:29
  • Just added it. Now, where in the world do I create an entry in the countries db while that does not happen when running code from rails console? – muichkine Aug 21 '12 at 11:43
  • You should create fixtures for countries as well. Read more here: http://guides.rubyonrails.org/testing.html#the-low-down-on-fixtures – Swanand Aug 21 '12 at 16:09
  • The countries table is already seeded. In test_helper.rb I have set, as described [here](http://stackoverflow.com/questions/1574797/how-to-load-dbseed-data-into-test-database-automatically): `load Rails.root.join('db','seeds.rb')` which seeds the entire countries db. – muichkine Aug 22 '12 at 06:59

0 Answers0