Ruby rspec-before:each和before:all的语法是什么!让

Ruby rspec-before:each和before:all的语法是什么!让,ruby,rspec,let,Ruby,Rspec,Let,我什么时候可以使用let或let!那么我如何引用测试中的变量呢 let和let的用法如何!与使用before:each和before:all相比?使用before:each和before:all的“经典”方式是 然后,通过在测试中使用@符号来引用实例变量,即 describe "tests" do before :each do @var1='a' @var2='b' end it "does stuff" do a=some_class.some_meth

我什么时候可以使用let或let!那么我如何引用测试中的变量呢


let和let的用法如何!与使用before:each和before:all相比?

使用before:each和before:all的“经典”方式是

然后,通过在测试中使用@符号来引用实例变量,即

describe "tests" do
  before :each do
    @var1='a'
    @var2='b'
  end
  it  "does stuff" do
    a=some_class.some_method(@var1)
    expect(a).to eq @var2
  end
end
如果希望变量在每次测试中具有相同的值,则可以在之前使用:all。 如果您希望一个变量在每次测试使用之前生成相同的值:each。 一般使用前:每次使用不当前:都会太容易导致间歇性测试失败。 把所有这些都看作是定义常数

让/让!格式如下所示:

describe "tests" do
  let(:var1)  {'a'}
  let!(:var2) {srand(25)}
  it  "does stuff" do
    a=some_class.some_method(var1)
    expect(a).to eq var2
  end
end
注意以下几点:

var1和var2现在看起来像局部变量,即在测试和设置中使用var1而不是@var1。实际上,它们是测试类方法。使用时需要注意的重要一点是,在随后使用@符号时不要使用@符号,这与您使用的before:each和before:all不同。 在let’s示例的第一种情况下,let与var1一起使用。这使得跨示例的备忘录能够工作。在第二种情况下,让我们来看看!与var2一起使用。这是必需的,因为您希望在每次使用之前显式地调用/设置变量方法。srand是一个很好的例子,说明您何时需要它,因为它为随机数生成器播种,但仅用于rand的下一次使用,因此如果在多个测试示例中使用它,则每次都需要重置它。
加上我的两分钱。我更喜欢离开:每一个都不是我正常的before语句。它看起来更干净。然后加上:所有在关闭的机会,我做了一个前:所有块。另一个有趣的发现是,您可以在主题行中模拟let范式,本质上是命名嵌套的主题主题:调用_some_method{some_class.some_methodvar1},因此it块是单行,读起来非常好。let和let都是!每次都要重新评估,这样无论使用哪一个,您的随机数每次都会不同。区别在于它们的初始化时间。允许在所有示例之前进行初始化-即使示例未使用它。让我们在第一次使用示例时对其进行初始化。
describe "tests" do
  let(:var1)  {'a'}
  let!(:var2) {srand(25)}
  it  "does stuff" do
    a=some_class.some_method(var1)
    expect(a).to eq var2
  end
end