module RspecLetCache

Constants

VERSION

Public Instance Methods

let_cache(attr_name, feature: false, after_all: nil, &block) click to toggle source

Permits to cache block results across tests and improve related tests performance @example

describe "articles index page" do
  let_cached(:article_cached) { Article.create!(title: 'sample title') }
  let_cached(:page_cached) do
    visit articles_path
    page
  end
  before { allow(page_cached).to receive(:reset!) }
  it 'includes page title' { expect(page_cached).to have_css('header h1', text: "Articles") }
  it 'includes articles' { expect(page_cached).to have_content(article_cached.title) }
  it 'includes button to delete article' { expect(page_cached).to have_css('table.articles_table .btn-delete') }
  it 'includes button to edit article' { expect(page_cached).to have_css('table.articles_table .btn-edit') }
end
# File lib/rspec_let_cache.rb, line 23
def let_cache(attr_name, feature: false, after_all: nil, &block)
  var_name = "@#{attr_name}"
  let(attr_name) do
    already_saved = RspecLetCacheObj.instance_variable_defined?(var_name)
    RspecLetCacheObj.instance_variable_set(var_name, instance_exec(&block)) unless already_saved
    RspecLetCacheObj.instance_variable_get(var_name)
  end
  before { allow(page).to receive(:reset!) } if feature # Make capybara page to be reusable
  after(:all) { RspecLetCacheObj.instance_variable_get(var_name)&.send(after_all) if after_all }
  after(:all) { RspecLetCacheObj.remove_instance_variable(var_name) rescue nil } # rubocop:disable Style/RescueModifier
end