我在 Minitest 中使用事务性固定装置,当我第一次运行它们时,我的测试成功运行(并通过):
rake test test/models/number_test.rb
Run options: --seed 31462
# Running:
..
Finished in 0.271344s, 7.3707 runs/s, 7.3707 assertions/s.
2 runs, 2 assertions, 0 failures, 0 errors, 0 skips
但是,当我立即再次运行时,它们失败了:
rake test test/models/number_test.rb
Run options: --seed 22968
# Running:
EE
Finished in 0.058652s, 34.0997 runs/s, 0.0000 assertions/s.
1) Error:
NumberTest#test_to_param_is_number:
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table "calls" violates foreign key constraint "fk_calls_extension_id"
DETAIL: Key (extension_id)=(760421015) is not present in table "extensions".
: COMMIT
2) Error:
NumberTest#test_twilio's_API_is_configured_to_come_to_this_number's_URL:
ActiveRecord::InvalidForeignKey: PG::ForeignKeyViolation: ERROR: insert or update on table "calls" violates foreign key constraint "fk_calls_extension_id"
DETAIL: Key (extension_id)=(760421015) is not present in table "extensions".
: COMMIT
2 runs, 0 assertions, 0 failures, 2 errors, 0 skips
我正在使用schema_plus gem 将外键添加到我的表中。
因为固定装置是按字母顺序加载的,所以我使用的deferrable: :initially_deferred
选项仅在事务结束时进行参照完整性检查,因此所有数据在检查之前都加载到所有表中。这就是使第一次运行测试起作用的原因……但是我不确定为什么第二次运行会有所不同。
运行重新测试时,不应该清空所有数据库表并使用 deferable 选项重新加载夹具吗?就像第一次后延迟不兑现一样。
为了让它工作,我总是必须rake db:reset
在运行测试之间运行,这看起来很疯狂。
更新 1:如果我注释掉所有的固定装置calls
(实际上与 中的任何测试无关number_test.rb
),一切正常……我可以按我喜欢的频率重新运行数字测试,它们仍然通过。所以,这似乎与延期有关。