如何在Rails 7 Minitest中配置命名空间模型Fixture?
Rails 7 命名空间模型 Fixture 配置解决方案
问题根源
你遇到的错误是因为Fixture 文件路径与模型表名不匹配:由于Users模块设置了table_name_prefix: 'users_',Users::Setting对应的数据库表名是users_settings,而非按命名空间路径解析的users/settings。Rails 误将test/fixtures/users/settings.yml识别为User模型的嵌套关联 Fixture,因此去users表查找不存在的user_id/user字段。
正确配置步骤
1. 调整 Fixture 文件路径与命名
将Users::Setting的 Fixture 文件命名为test/fixtures/users_settings.yml(对应表名users_settings),而非放在users/子目录下。
2. 编写 Fixture 内容
- User 模型 Fixture(test/fixtures/users.yml):
default_user: email: user@example.com # 补充你的 User 模型其他必填字段
- Users::Setting 模型 Fixture(test/fixtures/users_settings.yml):
default_setting: user: default_user # 关联 users.yml 中的 default_user 条目 # 补充你的 Users::Setting 模型其他字段,例如: theme: dark notifications_enabled: true
3. 简化模型关联(可选但推荐)
Rails 7 能自动推断关联的class_name和foreign_key,可以简化模型代码:
# app/models/user.rb class User < ApplicationRecord has_one :setting, class_name: 'Users::Setting' end # app/models/users/setting.rb class Users::Setting < ApplicationRecord belongs_to :user end
4. 测试中使用关联
在测试用例中正常调用关联即可:
test "user has a setting" do user = users(:default_user) assert_equal users_settings(:default_setting), user.setting end test "setting belongs to user" do setting = users_settings(:default_setting) assert_equal users(:default_user), setting.user end
内容的提问来源于stack exchange,提问作者Backo
相关产品推荐
相关产品推荐

