Rails7执行assert true测试报错:用户模型唯一键重复排查
解决Rails测试中Mysql2唯一键重复错误(Docker+Mac M1+Rails7.0.6)
问题场景
- 环境:Docker 部署、Mac M1 芯片、Rails 7.0.6 版本
- 触发情况:运行仅含
assert true的Article模型测试文件时,报错Mysql2::Error: Duplicate entry 'email' for key 'index_users_on_uid_and_provider' - 特殊表现:删除该Article测试文件后执行
rails test,仅提示环境不匹配,但无报错信息
原因定位
Rails测试框架默认会自动加载所有模型对应的fixture文件,哪怕当前测试完全不涉及User模型。自动生成的User fixture里存在重复的uid+provider组合,刚好触发了数据库index_users_on_uid_and_provider唯一索引的约束,导致插入数据时抛出重复键错误。
解决办法
1. 修复User fixture的重复数据
直接修改test/fixtures/users.yml,保证每条记录的uid和provider组合唯一,示例:
# test/fixtures/users.yml default_user: uid: default@example.com provider: email name: Default User another_user: uid: another@example.com provider: email name: Another User
2. 单个测试文件仅加载所需fixture
如果不想调整全局配置,可在Article测试文件中指定只加载当前测试需要的fixture,避免加载无关的User fixture:
# test/models/article_test.rb require "test_helper" class ArticleTest < ActiveSupport::TestCase # 仅加载Article模型的fixture self.use_fixtures = :articles test "should be valid" do assert true end end
3. 全局调整fixture加载策略
如果大部分测试都不需要自动加载所有fixture,可修改test/test_helper.rb,替换默认的全量加载规则:
# test/test_helper.rb # 移除或注释掉默认的全量加载 # fixtures :all # 后续在需要的测试类中单独指定要加载的fixture,比如: # class SomeModelTest < ActiveSupport::TestCase # fixtures :some_models # end
内容的提问来源于stack exchange,提问作者Yuzu Sakura
相关产品推荐
相关产品推荐

