diff --git a/lib/rspec/power_assert.rb b/lib/rspec/power_assert.rb index 6963814..ea4ee17 100644 --- a/lib/rspec/power_assert.rb +++ b/lib/rspec/power_assert.rb @@ -1,6 +1,7 @@ require "rspec/power_assert/version" require "rspec/core" require "power_assert" +require "securerandom" module PowerAssert class << self @@ -52,9 +53,17 @@ def is_asserted_by(&blk) private + def change_context(&blk) + self_name = :"_#{SecureRandom.hex}" + blk_name = :"_#{SecureRandom.hex}" + bind = blk.binding + bind.local_variable_set(self_name, self) + bind.local_variable_set(blk_name, blk) + bind.eval("-> { #{self_name}.instance_exec(&#{blk_name}) }") + end + def evaluate_example(method_name, &blk) - # hack for context changing - pr = -> { self.instance_exec(&blk) } + pr = change_context(&blk) result, msg = ::PowerAssert.rspec_start(pr, assertion_method: method_name) do |tp| [tp.yield, tp.message_proc.call]