ruby-on-rails - 如何在 Rails 7 Minitest 中设置命名空间模型装置?

标签 ruby-on-rails testing namespaces fixtures minitest

我有类似的问题,如 this old one与在 Rails 7 中使用命名空间模型固定装置进行 has_one-belongs_to 关联相关。

关于 ActiveRecord,在我的模型文件中我已经:

# app/models/user.rb
class User < ApplicationRecord
  has_one :setting, :class_name  => 'Users::Setting', :foreign_key => 'user_id'
end

# app/models/users/setting.rb
class Users::Setting < ApplicationRecord
  belongs_to :user, :class_name  => 'User', :foreign_key => 'user_id'
end

# app/models/users.rb
module Users
  def self.table_name_prefix
    'users_'
  end
end

关于固定装置,在 test/fixtures/users.yml 文件中,我创建并成功地将以下内容用于用户模型:

# test/fixtures/users.yml

foo:
  id: 1
  name: Foo
  email: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="c4a2abab84a6a5b6eaa7aba9" rel="noreferrer noopener nofollow">[email protected]</a>
  ...

bar:
  id: 2
  name: Bar
  email: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="a9cbc8dbe9cfc6c687cac6c4" rel="noreferrer noopener nofollow">[email protected]</a>
  ...

但是,我在为 Users::Setting 模型设置固定装置时遇到了麻烦。我尝试创建 test/fixtures/users/settings.yml 文件并使用以下内容,但没有成功:

# test/fixtures/users/settings.yml

_fixture:
  model_class: Users::Setting

foo_setting:
  id: 1
  user_id: 1
  ...

# foo_setting:
#   id: 1
#   user: foo
#   ...

当我运行测试时,出现如下错误:

Minitest::UnexpectedError: ActiveRecord::Fixture::FixtureError: table "users" has no columns named "user_id"/"user".

在用户装置中,我也尝试使用以下内容,但出现相同的 Minitest 错误:

# test/fixtures/users.yml

foo:
  id: 1
  name: Foo
  email: <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="3d5b52527d5f5c4f135e5250" rel="noreferrer noopener nofollow">[email protected]</a>
  setting: foo_setting (Users:Setting) # <<<
  ...

我也尝试像这样编辑 test/test_helper.rb 文件,但我得到了相同的 Minitest 错误:

class ActiveSupport::TestCase
  fixtures :all
  set_fixture_class 'users/settings' => Users::Setting
end

在 test/integration/user_flows_test.rb 中,我:

# test/integration/user_flows_test.rb

require "test_helper"

class UserFlowsTest < ActionDispatch::IntegrationTest
  fixtures :users

  test "can something" do
    user = users(:foo)
    ...
  end
end

如何声明命名空间 Users::Setting 的工作装置?

最佳答案

找到解决方案:

  1. 在 test/test_helper.rb 中,我添加了 set_fixture_class :users_settings => Users::Setting

测试/test_helper.rb

class ActiveSupport::TestCase
  ...

  # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
  fixtures :all

  # Namespaced models/fixtures
  set_fixture_class :users_settings => Users::Setting

  ...
end
  • (重新)将包含固定语句的文件命名为users_settings.yml
  • 在 test/fixtures/users_settings.yml 中找到文件 users_settings.yml
  • 关于ruby-on-rails - 如何在 Rails 7 Minitest 中设置命名空间模型装置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75796603/

    相关文章:

    ruby-on-rails - 我如何指定 before_filters?

    ruby-on-rails - 有没有办法db :seed only one table in Rails?

    ruby-on-rails - 设置 http header RSpec 2.4/Rails 3

    javascript - 没有基于 javascript 的集成的 a/b 测试

    testing - 并行功能和验收测试 (SpecFlow)

    ruby-on-rails - 使用 Ruby on Rails 的表单助手

    javascript - 是否有任何用于在服务器端运行的脚本的 Javascript 代码覆盖工具(无浏览器)

    r - 在函数运行期间使用参数值作为 R 中的变量名

    namespaces - Teamcity + NUnit - 从 dll 中排除程序集

    visual-studio - 为什么我的项目会继续寻找过时的子文件夹?