rspec - rspec 中特定上下文的一次性配置?

标签 rspec

我有一些昂贵的测试设置,仅对我的规范中的少数示例是必需的,如果需要,它只需要运行一次。因为它很慢,所以我试图避免将它放在 before(:each) block 中,但 before(:all) 似乎不适合我的需要。我认为一个复杂的因素是昂贵的部分必须在其他一些常见设置之后运行。 (这是一个带有搜索引擎的应用程序的 capybara 测试。创建一些记录后,我需要索引测试数据库以获得搜索结果。)我的设置是这样的:

feature 'some particular feature' do
  before(:each) do
    # a bunch of common test setup (creating records that this test will use)
  end

  describe 'simple example #1' do
    # a simple example that doesn't need the expensive setup
  end
  .
  .
  .
  describe 'simple example #N' do
    # a simple example that doesn't need the expensive setup
  end

  describe 'a more complicated example' do
    before(:all) do
      # expensive_setup that depends on the records created above
    end

    it 'does something' do ... end
    it 'does something else' do ... end
    .
    .
    .
    it 'even does this' do ... end
  end      
end

问题是当 rspec 在上下文中运行示例时,more complicated example , before(:all) block 在 before(:each) 之前运行它所依赖的 block 。到目前为止,我不得不将昂贵的设置放在 before(:each) 中。 block 而不是 before(:all)堵塞。这意味着必须为每个 it 运行昂贵的设置。阻止该示例。有一个更好的方法吗?

更新:
我没有提到昂贵操作的结果仅取决于数据库。因此,由于每个示例都使用相同的数据库设置,因此可以安全地为每个示例重用昂贵操作的结果。此外,结果存在于文件系统中,因此在示例之间不会被清除。

我认为要走的路是在文件系统中放置某种标记,表明结果很好,不需要重新计算。

最佳答案

我通过计算通用设置的摘要并将其与昂贵操作的结果一起保存来解决这个问题。在执行昂贵的操作之前,请检查当前摘要是否与磁盘上的摘要匹配。如果是这样,则无需这样做。由于所有示例共享通用设置,因此昂贵的操作最多只运行一次。

关于rspec - rspec 中特定上下文的一次性配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10487377/

相关文章:

ruby - 如何使用 RSpec::Core::RakeTask 创建 RSpec Rake 任务?

ruby-on-rails - 如果 rspec 测试失败,则启动 ruby​​ 调试器

ruby - 在 Sinatra 模块化应用程序中设置 RSpec

ruby - FactoryGirl的麻烦

ruby-on-rails - 为 RSpec 生成缺失的规范文件

ruby-on-rails - RSpec & Rails : Stub request. 辅助规范的路径

ruby - 如何为一种方法编写 rspec 测试

ruby-on-rails - 升级到ruby 3和rails 6.1后未定义的方法 `file_fixture_path'

ruby-on-rails - 使用Google Maps时, capybara 测试在第一个测试中失败并显示Timeout::Error

ruby-on-rails - Rspec - 未定义的方法 'let'