rspec - 之前的语法是什么:每个和之前:all vs let!然后让

时间:2014-04-13 16:55:07

标签: ruby rspec let

我什么时候可以使用let或let!那我怎么能在测试中引用变量呢?

如何使用let和let!与之前使用相比:每个和之前:所有?

1 个答案:

答案 0 :(得分:0)

经典'使用before(:each)before(:all)的方式是

describe "tests" do
  before :each do
    @var1='a'
    @var2='b'
  end
end

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

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

如果您希望变量在每个测试中具有相同的值,则可以使用before :all 如果您希望变量为每个测试使用before :each生成相同的值 通常使用before :each因为before :all的不当使用很容易导致间歇性的测试失败 将before :all视为定义常量。

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

注意几件事:

  1. var1var2现在看起来像局部变量,即在测试和设置中使用var1 而不是 @var1。实际上它们是测试类方法。需要注意的重要一点是, NOT 使用@符号时,请使用:each符号,而不是之前的before :alllet。< / LI>
  2. let示例的第一种情况下,var1let!一起使用。这样可以使跨例子的记忆起作用。在第二种情况下,var2srand()一起使用。这是必需的,因为您希望在每次使用之前显式调用/设置变量(方法)。 rand()是一个很好的例子,当你需要它时,因为它为随机数生成器播种,但仅用于{{1}}的下一次使用,因此如果在多个测试示例中使用它,则每次都需要重置它。 / LI>