代码之家  ›  专栏  ›  技术社区  ›  nrmb Santhosh

rspec中关于timecop的Ruby常量日期变量

  •  2
  • nrmb Santhosh  · 技术社区  · 6 年前

    嗨,我有一个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 它打破了我的测试。

    对于我的大多数方法,是否有使用相同变量的变通方法?还是我用错了?

    如果有任何帮助,我将不胜感激!

    2 回复  |  直到 6 年前
        1
  •  1
  •   nrmb Santhosh    6 年前

    实际上,我从Ruby slack社区得到了这个答案。我得到了一个建议,可以将其作为一种方法。

    比如:

    def start_date
      Date.current.at_beginning_of_month.in_time_zone + 2.days
    end
    

    我还刚刚了解了@spickermann的意思,为什么我不应该使用常量变量,因为它从服务器开始就保持不变,它将具有初始值。从技术上讲,它不是一个常数:出汗微笑:

        2
  •  1
  •   Adam Berman    6 年前

    无论您是否在测试中使用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