【问题标题】:Defining and using constants inside Rspec's hooks在 Rspec 的钩子中定义和使用常量
【发布时间】:2016-01-20 18:37:28
【问题描述】:

我对 Rspec 有点陌生,当有问题出现时,我正在编写一些测试示例。

首先,我使用全局变量来定义三个常量值,我将在很多测试中使用。例如:

$message = 'this is a test'

但是,我注意到这个全局变量被转移到其他测试文件并导致问题。好的......然后决定避免使用全局变量,因为如果我的测试文件数量增加,这可能会在未来造成很多痛苦。

然后我去了 let() 块。示例:

let(:message) { 'this is a test' }

现在的问题是这个变量不能在钩子前后使用。好的...

我最后一次尝试是在上下文/描述中使用常量,如下所示:

self::MESSAGE =  'this is a test'

但是,就像 let's this 一样,它不能在钩子中使用,因为它们既不是类也不是模块。

所以,我被困住了......

你们是怎么处理的?我需要为此创建实例变量吗?这是我可以使用的任何其他替代方案吗?

非常感谢。

【问题讨论】:

  • 需要明确的是,let 可以在 before(:each)after(:each) 块中使用。它们不能在before(:all) 块中使用。总的来说,我认为 before(:all) 块是代码异味,因此将测试重构为仅使用 before(:each) 块可能会解决此问题。
  • 好的,是的...我仍在掌握测试的最佳方法,因此我会考虑您的建议!谢谢!

标签: ruby rspec constants


【解决方案1】:

您还有另一种定义数据的选项——实例变量。

before do
  @data = [ {one: 1, two: 2},
            {one: 2, two: 3} ]
end

您可以在before 范围内的所有测试中使用@data。这与 let 几乎相同,仅用于设置静态数据,但它可能更适合您 - 没有看到您的代码很难说。

【讨论】:

  • 酷,我想到了实例变量,但不是你放在这里的方式。这看起来确实不错,我一定会试一试。谢谢!不过,只有一个问题,这个 before 块是 for :each 还是 :all?
猜你喜欢
  • 2021-01-20
  • 2020-08-27
  • 2020-12-05
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
  • 1970-01-01
  • 2020-07-18
  • 1970-01-01
相关资源
最近更新 更多