rspec

时间:2018-04-02 06:54:27

标签: ruby-on-rails ruby rspec timecop

您好我有一个使用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并且它正在破坏我的测试。

对于我的大多数方法,是否有使用相同变量的解决方法?还是我错误地使用了这个?

我将不胜感激任何帮助!

2 个答案:

答案 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