我在设置使用外键的fixtures测试时遇到了麻烦!如果有人能帮助我理解这个问题,我将不胜感激。
例如,假设:user_type
模型引用了:role
模型,当测试被执行并且测试数据库中的所有数据被删除以重新插入时,Rails首先从:role
模型中删除数据,而不是先从:user_type
中删除数据再删除:role
中的数据。
fixtures:
#roles.yml
technical:
name: 'Technical'
obs: 'User Role for technical / maintenance users!'
#user_types.yml
technic:
role: technical
name: 'Technic'
is_admin: true
测试:
#app/test/models/role_test.rb
require 'test_helper'
class RoleTest < ActiveSupport::TestCase
fixtures :roles
test 'save Role without name' do
data = Role.new()
data.valid?
assert data.errors.added?(:name, :blank), 'Role saved without name!'
end
end
#app/test/models/user_type_test.rb
require 'test_helper'
class UserTypeTest < ActiveSupport::TestCase
fixtures :user_types
test 'save User Type without role_id' do
data = UserType.new(:name => 'public')
data.valid?
assert data.errors.added?(:role_id, :blank), 'User Type saved without role'
end
end
当测试第一次运行时,一切都没问题。Rails清空数据库(此时为空,没有违反约束),然后插入fixture的数据,测试正常运行。
下一次运行测试时,它们将失败,因为当Rails开始从数据库中删除数据时,它以role模型/表而不是user_type开头! 因为在这些模型上定义了外键,所以会发生违规,因为user_type仍在参考模型表中的数据!应该如何正确地做? 有没有机制告诉Rails销毁fixture数据的顺序?顺便说一下,我正在使用RubyOnRails 4和Firebird 2.5。
我已经苦苦挣扎了几天,但还没有做好!
提前致谢!