在规范中使用全局变量好吗?
is it good to use global variables in specs?
在规范中使用全局变量好吗?
我想在我的测试中使用这个变量。并在 spec_helper.rb
中定义
$now = DateTime.parse('2020-01-01 00:00:01 -0500')
这是个好主意吗?为什么?
这是个坏主意。实际上,您应该避免在代码中的任何地方使用全局变量。
您可以使用 before 块来设置任何需要与您的测试示例一起使用的变量。
示例:
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
在 RSpec 和一般情况下,不鼓励使用全局变量。原因如下:
在任何地方修改全局变量都会影响所有地方的代码。
因此,如果测试修改了 $now
变量,则所有后续测试都会受到修改的影响。这可能会导致一些非常难以调试的测试失败。很难调试,因为测试是正确的。但是,全局值不会。因此,您无法通过简单的检查发现测试中的错误。您必须在运行时调试它。
自动化测试需要相互独立。这就是 RSpec 延迟执行 let
语句的原因。 let
允许您在单个示例的上下文中定义变量。 RSpec docs 是这样说的:
Use let to define a memoized helper method. The value will be cached across
multiple calls in the same example but not across examples.
这意味着如果你这样定义now
:
let(:now) { DateTime.parse('2020-01-01 00:00:01 -0500') }
在每次测试中,该值都保证与您所说的完全一致。因为该值是在每个示例的基础上记忆的,所以一个测试永远不会影响另一个测试在执行时收到的值。
如果您仍然不相信,我建议您使用全局常量而不是全局变量。至少,如果您尝试更改该值,Ruby 会警告您。
在规范中使用全局变量好吗?
我想在我的测试中使用这个变量。并在 spec_helper.rb
$now = DateTime.parse('2020-01-01 00:00:01 -0500')
这是个好主意吗?为什么?
这是个坏主意。实际上,您应该避免在代码中的任何地方使用全局变量。
您可以使用 before 块来设置任何需要与您的测试示例一起使用的变量。
示例:
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
在 RSpec 和一般情况下,不鼓励使用全局变量。原因如下:
在任何地方修改全局变量都会影响所有地方的代码。
因此,如果测试修改了 $now
变量,则所有后续测试都会受到修改的影响。这可能会导致一些非常难以调试的测试失败。很难调试,因为测试是正确的。但是,全局值不会。因此,您无法通过简单的检查发现测试中的错误。您必须在运行时调试它。
自动化测试需要相互独立。这就是 RSpec 延迟执行 let
语句的原因。 let
允许您在单个示例的上下文中定义变量。 RSpec docs 是这样说的:
Use let to define a memoized helper method. The value will be cached across multiple calls in the same example but not across examples.
这意味着如果你这样定义now
:
let(:now) { DateTime.parse('2020-01-01 00:00:01 -0500') }
在每次测试中,该值都保证与您所说的完全一致。因为该值是在每个示例的基础上记忆的,所以一个测试永远不会影响另一个测试在执行时收到的值。
如果您仍然不相信,我建议您使用全局常量而不是全局变量。至少,如果您尝试更改该值,Ruby 会警告您。