【问题标题】:When to use RSpec's let! instead of before?何时使用 RSpec 的让!而不是以前?
【发布时间】:2016-08-29 20:57:13
【问题描述】:

有人告诉我,使用 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) 里面的变量。但在这里感觉他们只是盲目地遵循博客文章中某处的短语“使用 let 助手而不是之前的块”。

非常感谢!

【问题讨论】:

  • 就我而言,让我们懒惰地评估。即使没有被引用,一个 before 也会创建所有的记录。使用 let 定义的变量只有在稍后在测试中使用时才会被评估
  • @theDrifter "关闭为重复" :)
  • @Ven 并不是真的这是完全不同的问题。 我说的是let! 我知道 let 之间的区别,以及为什么要使用它而不是之前。这就是重点。我不明白定义let!(:abcd) { Model.create() } 评估代码的意义。它会创建记录,但以后不会真正调用abcd。我的意思是你可以在街区内以同样的运气做到这一点。完全没有区别,只是第二个例子更清晰、更合乎逻辑。

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


【解决方案1】:

不,最好始终使用let! 而不是before 块。你是对的:

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

请注意,let!before 块在任何情况下都应谨慎使用。它们会造成后来的测试编写者在不需要let!before 的结果的同一块中添加测试的风险,从而使这些测试更难理解且速度更慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-14
    • 2019-12-28
    • 2013-08-30
    • 2021-09-29
    • 2012-09-16
    • 2015-03-17
    • 2019-06-12
    • 2016-09-08
    相关资源
    最近更新 更多