您好我有一个使用Date的一些常量变量的Ruby类:
START_DATE = Date.current.at_beginning_of_month.in_time_zone + 2.days
LAST_DATE = Date.current.at_beginning_of_month.in_time_zone + 10.days
我有一些使用此日期的方法,如下所示:
Date.current.in_time_zone.between?(START_DATE, LAST_DATE)
在我的rspec文件中我正在使用Timecop.freeze
并且它正在破坏我的测试。
对于我的大多数方法,是否有使用相同变量的解决方法?还是我错误地使用了这个?
我将不胜感激任何帮助!
答案 0 :(得分:1)
我实际上从Ruby slack社区得到了这个答案,我得到了一个建议,使其成为一种方法。
如下所示:
def start_date
Date.current.at_beginning_of_month.in_time_zone + 2.days
end
我也刚刚了解了@spickermann的意思,为什么我不应该使用常量变量,因为它将从服务器的起始处保持不变,它将具有初始值。从技术上讲,它不是一个常数。 :sweatsmile:
答案 1 :(得分:0)
无论您是否在测试中使用Timecop进行其他交互,您可能还需要考虑自己对常量进行存根。一旦测试了设置常量所涉及的逻辑,请考虑使用stub_const
来确保将常量设置为测试套件中所需的值。例如,您可能在测试套件中包含一个类似于以下内容的块:
before :each do
stub_const("MyClass::START_DATE", <start_time>)
stub_const("MyClass::END_DATE", <end_time>)
end
更新:
下面的评论说这不起作用,这很奇怪......绝对适合我。刚刚测试过这样:
class User
MY_CONST = "foo"
def my_method
MY_CONST
end
end
然后在rspec:
describe User do
it "works unstubbed" do
expect(User.new.my_const).to eq("foo")
end
it "works stubbed" do
stub_const("User::MY_CONST", "bar")
expect(User.new.my_const).to eq("bar")
end
end