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

Kat*_*ida 6 rspec ruby-on-rails

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

class User
  # skip before

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

  # skip after
end
Run Code Online (Sandbox Code Playgroud)

而且,我想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
Run Code Online (Sandbox Code Playgroud)

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

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

m. *_*org 6

该文档表示,示例运行后常量值会重置https://relishapp.com/rspec/rspec-mocks/v/2-11/docs/stubbing-constants/stub-define-constant

您是否尝试过在示例中存根常量?

context "MAX_FILE_SIZE is 1byte" do
  it do
    stub_const "User::MAX_FILE_SIZE", 1.bytes.to_i
    # test something
  end
end
Run Code Online (Sandbox Code Playgroud)