私が持っているモデル(ユーザー)を単体テストしようとすると、エラーが発生してかなり混乱しています。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
今 test/unit/user_test.rb にあります
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
ここまでは順調ですね。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)
さて、テーブルの国のどこかに隠し挿入がある場合 (私が要求したことはありません!)、Rails コンソールで同じコードを実行すると、それを確認できるはずです。だから私は試しました:
> 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"
わかりました、国テーブルへの挿入はありません。
私が行方不明で、このエラーを生成する舞台裏で何が起こっているかについて何か考えはありますか?
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