如何覆盖RSpec内部验证引用的常量

时间:2017-07-19 03:09:21

标签: ruby-on-rails rspec

我的模型有这样的自定义验证。

class User
  # skip before

  MAX_FILE_SIZE = 10.megabytes.to_i
  validates :file, size: { max: MAX_FILE_SIZE }

  # skip after
end

而且,我想在规范中通过覆盖MAX_FILE_SIZE来测试MAX_FILE_SIZE。所以,我这样写了。

context "MAX_FILE_SIZE is default" do
  it do
    # test something
  end
end
context "MAX_FILE_SIZE is 1byte" do
  before do
    stub_const "User::MAX_FILE_SIZE", 1.bytes.to_i
  end
  it do
    # test something
  end
end

第一次测试通过。但是,由于MAX_FILE_SIZE未更改,第二次测试失败。

你可以告诉我为什么吗?以及如何解决这种情况。

2 个答案:

答案 0 :(得分:0)

文档说明在示例运行https://relishapp.com/rspec/rspec-mocks/v/2-11/docs/stubbing-constants/stub-defined-constant

后,常量值会重置

您是否尝试在示例中隐藏常量?

context "MAX_FILE_SIZE is 1byte" do
  it do
    stub_const "User::MAX_FILE_SIZE", 1.bytes.to_i
    # test something
  end
end

答案 1 :(得分:0)

我找到了原因。

由于config.cache_classes = true中的config/environments/test.rb,我的自定义验证程序只创建了一次。更改的常量值对验证程序的实例没有影响。

我无法知道最佳解决方案。

以下是不是一个好的解决方案。

  1. config.cache_classes = false。{/ li>中设置config/environments/test.rb
  2. 在设置常量值存根之后重新加载模型类,就像这样。

    context "MAX_FILE_SIZE is 1byte" do
      before do
        stub_const "User::MAX_FILE_SIZE", 1.bytes.to_i
        load "user.rb"
      end
      it do
        # test something
      end
    end
    
  3. 禁止在模型类中更改常量值,如下所示。

    class User
      # skip before
    
      MAX_FILE_SIZE ||= 10.megabytes.to_i
      validates :file, size: { max: MAX_FILE_SIZE }
    
      # skip after
    end