module RailsStuff::RSpecHelpers::Concurrency::ClassMethods

Public Instance Methods

check_concurrent(&block) click to toggle source

Runs given block in current context and nested context with concurrent subject.

subject { -> { increment_value_once } }
# This will create 2 examples. One for current contex, and one
# for current context where subject will run multiple times concurrently.
check_concurrent do
  it { should change { value }.by(1) }
end
# File lib/rails_stuff/rspec_helpers/concurrency.rb, line 33
def check_concurrent(&block)
  instance_eval(&block)
  context 'running multiple times concurrently' do
    concurrent_subject!
    instance_eval(&block)
  end
end
concurrent_subject!() click to toggle source

Defines subject which runs parent's value in multiple threads concurrently. Define `thread_args` or `threads_count` with `let` to configure it.

Sets metadata `concurrent: true` so database cleaner uses right strategy.

Calls superclass method
# File lib/rails_stuff/rspec_helpers/concurrency.rb, line 15
def concurrent_subject!
  metadata[:concurrent] = true
  subject do
    super_proc = super()
    args = defined?(thread_args) && thread_args
    args ||= defined?(threads_count) && threads_count
    -> { concurrently(args, &super_proc) }
  end
end