我的模型有这样的自定义验证。
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未更改,第二次测试失败。
你可以告诉我为什么吗?以及如何解决这种情况。答案 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
,我的自定义验证程序只创建了一次。更改的常量值对验证程序的实例没有影响。
我无法知道最佳解决方案。
以下是不是一个好的解决方案。
config.cache_classes = false
。{/ li>中设置config/environments/test.rb
在设置常量值存根之后重新加载模型类,就像这样。
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
禁止在模型类中更改常量值,如下所示。
class User
# skip before
MAX_FILE_SIZE ||= 10.megabytes.to_i
validates :file, size: { max: MAX_FILE_SIZE }
# skip after
end