何时使用RSpec让!而不是之前?

时间:2016-08-29 20:57:14

标签: ruby-on-rails ruby unit-testing rspec

我被告知使用let!()代替before(:each)阻止是有意义的。但是,我没有看到这样做的逻辑。在下面的例子中做出类似的事情是否真的有意义:

context 'my super context' do
  let!(:something) do
    Model.create(subject: "Hello", body: "World")
  end

  it '...' do
    # We never call something
    # All we want is just to evaluate and create the record
  end
end

请注意,您根本不会在示例中的任何位置拨打something。从技术上讲,我并没有看到它和它之间有太大的区别,除非它实际上更严格,更容易理解,没有文档就像普通的英语:

context 'my super context' do
  before(:each) do
    Model.create(subject: "Hello", body: "World")
  end

  it '...' do
    # We never call something
    # All we want is just evaluate and create the record
  end
end

有人可以帮我理解我给出的规则背后的想法吗? 我可以理解为什么你会使用let而不是before(:all)before(:each)将变量放在里面。但在这里,只是觉得他们只是盲目地遵循博客文章中某处找到的“使用一个让帮手而不是前一块”的短语。

非常感谢!

1 个答案:

答案 0 :(得分:2)

不,始终使用let!而不是before阻止不是最佳做法。你是对的:

  • 如果您想在每个示例之前运行代码块,并且需要该代码来返回值,请使用let!
  • 如果要在每个示例之前运行代码块,但不需要将该代码中的值直接传递给示例,请使用before。 (使用let!会误导读者认为其价值正在被使用。)

请注意,在任何情况下都应谨慎使用let!before块。它们会增加以后的测试编写者在同一个块中添加测试的风险,这些测试不需要let!before的结果,这使得这些测试更难以理解和更慢。