在规范中使用全局变量是否很好?

时间:2019-02-27 16:03:16

标签: ruby-on-rails rspec rspec-rails rspec3

在规范中使用全局变量好吗?

我想在测试中使用此var。并在spec_helper.rb

中定义它
$now = DateTime.parse('2020-01-01 00:00:01 -0500')

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

2 个答案:

答案 0 :(得分:2)

在RSpec中,一般不建议使用全局变量。原因如下:

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

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

自动测试必须彼此独立。这就是RSpec具有延迟执行的let语句的原因。 let允许您在单个示例的上下文中定义变量。 RSpec docs说的是:

  

使用let定义记忆的辅助方法。该值将在   同一示例中有多个调用,但没有跨示例。

这意味着,如果您这样定义now

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

保证该值恰好是您在每个测试中所说的值。由于该值是根据每个示例存储的,因此一个测试永远不会影响另一个测试在执行时收到的值。

如果仍然不确定,我建议对全局变量使用全局常量。至少在那时,如果您尝试更改值,Ruby会警告您。

答案 1 :(得分:1)

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

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

示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
        <canvas id="canvas"></canvas>
       
</body>
</html>