在规格中使用全局变量是否合适?

问题描述 投票:0回答:2

在规格中使用全局变量是否合适?

我想在我的测试中使用这个var。并在spec_helper.rb中定义它

$now = DateTime.parse('2020-01-01 00:00:01 -0500')

这是个好主意吗?为什么?

ruby-on-rails rspec rspec-rails rspec3
2个回答
2
投票

在RSpec和一般情况下,不鼓励使用全局变量。原因如下:

在任何地方修改全局变量会影响到处的代码。

因此,如果测试曾修改过$now变量,则所有后续测试都会受到修改的影响。这可能导致一些非常难以调试的测试失败。很难调试,因为测试是正确的。但是,全球的价值不会。因此,您无法通过简单的检查找到测试中的错误。您必须在运行时调试它。

自动化测试需要彼此独立。这就是为什么RSpec有懒惰执行的let声明。 let允许您在单个示例的上下文中定义变量。以下是RSpec docs所说的:

使用let来定义memoized帮助器方法。该值将在同一示例中的多个调用之间缓存,但不跨示例缓存。

这意味着如果你像这样定义now

let(:now) { DateTime.parse('2020-01-01 00:00:01 -0500') }

保证该值与您在每次测试中所说的完全一致。由于该值是基于每个示例进行记忆的,因此一个测试永远不会影响另一个测试在执行时收到的值。

如果您仍然不相信,我建议在全局变量上使用全局常量。至少那时,如果你试图改变价值,Ruby会警告你。


1
投票

这是个坏主意。实际上,您应该避免在代码中的任何位置使用全局变量。

您可以在块之前使用设置任何需要与测试示例一起使用的变量。

例:

describe Thing do
  before(:each) do
    @now = DateTime.parse('2020-01-01 00:00:01 -0500')
  end

  describe "initialized in before(:each)" do
    it "example 1" do
      // here @now is available
    end

    it "example 2" do
      // here @now is also available
    end
  end
end
© www.soinside.com 2019 - 2024. All rights reserved.