2

嗨,我有一个 Ruby 类,其中包含一些使用 Date 的常量变量:

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,它破坏了我的测试。

是否有一种解决方法可以对我的大多数方法使用相同的变量?还是我使用不正确?

我将不胜感激任何帮助!

4

2 回答 2

1

无论您是否将 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
于 2018-04-02T07:02:04.333 回答
1

实际上,我从 Ruby slack 社区得到了这个答案,我得到了一个建议,让它成为一种方法。

所以像:

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

我还刚刚了解了@spickermann 的含义,为什么我不应该使用常量变量,因为它会从服务器启动时保持不变,它将具有初始值。从技术上讲,它不是一个常数。:汗笑:

于 2018-04-02T11:21:42.203 回答