【问题标题】:Rails 6 How to properly test for Enums _scopes: falseRails 6 如何正确测试 Enums _scopes: false
【发布时间】:2021-01-04 19:03:54
【问题描述】:

我有一个 rails 6 应用程序。 我正在使用rspec 进行测试 我的模型是这样的

class Product < ApplicationRecord
  ... 
  enum status: [:sold_out, :active, :archived], _scopes: false
  ...
end

现在我的测试是这样的

it { is_expected.to define_enum_for(:status).with_values([:sold_out, :active, :archived]) }
 # this returns an error 

预期任务将 :status 定义为由整数支持的枚举,映射 ‹"sold_out"›到‹0›,‹"active"›到‹1›,‹"归档"›到 ‹2›。 :status 确实映射到 这些值,但枚举是(我们不知道是哪个)。

现在,如果我删除 _scopes: false,则测试通过。但我怎样才能让我的测试通过保持_scopes: false

【问题讨论】:

    标签: rspec scope ruby-on-rails-6


    【解决方案1】:

    今天遇到了类似的问题。解决方案是将.with_prefix(:foo) 添加到规范中,其中foo 是枚举列的名称。例如:

    is_expected.to define_enum_for(:status)
      .with_values(:sold_out, :active :archived)
      .with_prefix(:status)
    

    【讨论】:

      【解决方案2】:

      你在用Shoulda Matchers吗?

      假设您是,define_enum_for 看起来会检查是否存在 value methods,它们是自动创建的,但 won't be available when you disable scopes

      如果您需要禁用范围,我会考虑编写一个不带值方法测试的自定义匹配器。

      【讨论】:

        猜你喜欢
        • 2018-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多