1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
|
require 'spec_helper'
describe "Spy" do
class Foo
def method_that_accepts_a_block(&block)
end
end
let(:obj) { Foo.new }
describe "#and_yield" do
context "with eval context as block argument" do
it "evaluates the supplied block as it is read" do
evaluated = false
Spy.on(obj, :method_that_accepts_a_block).and_yield do |eval_context|
evaluated = true
end
expect(evaluated).to be_true
end
it "passes an eval context object to the supplied block" do
Spy.on(obj, :method_that_accepts_a_block).and_yield do |eval_context|
expect(eval_context).not_to be_nil
end
end
it "evaluates the block passed to the stubbed method in the context of the supplied eval context" do
expected_eval_context = nil
actual_eval_context = nil
Spy.on(obj, :method_that_accepts_a_block).and_yield do |eval_context|
expected_eval_context = eval_context
end
obj.method_that_accepts_a_block do
actual_eval_context = self
end
expect(actual_eval_context).to equal(expected_eval_context)
end
context "and no yielded arguments" do
it "passes when expectations set on the eval context are met" do
configured_eval_context = nil
context_foo_spy = nil
Spy.on(obj, :method_that_accepts_a_block).and_yield do |eval_context|
configured_eval_context = eval_context
context_foo_spy = Spy::Subroutine.new(configured_eval_context, :foo).hook(force: true)
end
obj.method_that_accepts_a_block do
foo
end
expect(context_foo_spy).to have_been_called
end
it "fails when expectations set on the eval context are not met" do
configured_eval_context = nil
context_foo_spy = nil
Spy.on(obj, :method_that_accepts_a_block).and_yield do |eval_context|
configured_eval_context = eval_context
context_foo_spy = Spy::Subroutine.new(configured_eval_context, :foo).hook(force: true)
end
obj.method_that_accepts_a_block do
# foo is not called here
end
expect(context_foo_spy).to_not have_been_called
end
end
context "and yielded arguments" do
it "passes when expectations set on the eval context and yielded arguments are met" do
configured_eval_context = nil
yielded_arg = Object.new
context_foo_spy = nil
Spy.on(obj, :method_that_accepts_a_block).and_yield(yielded_arg) do |eval_context|
configured_eval_context = eval_context
context_foo_spy = Spy::Subroutine.new(configured_eval_context, :foo).hook(force: true)
Spy::Subroutine.new(yielded_arg, :bar).hook(force: true)
end
obj.method_that_accepts_a_block do |obj|
obj.bar
foo
end
expect(context_foo_spy).to have_been_called
expect(Spy.get(yielded_arg, :bar)).to have_been_called
end
it "fails when expectations set on the eval context and yielded arguments are not met" do
configured_eval_context = nil
yielded_arg = Object.new
context_foo_spy = nil
Spy.on(obj, :method_that_accepts_a_block).and_yield(yielded_arg) do |eval_context|
configured_eval_context = eval_context
context_foo_spy = Spy::Subroutine.new(configured_eval_context, :foo).hook(force: true)
Spy::Subroutine.new(yielded_arg, :bar).hook(force: true)
end
obj.method_that_accepts_a_block do |obj|
# obj.bar is not called here
# foo is not called here
end
expect(context_foo_spy).to_not have_been_called
expect(Spy.get(yielded_arg, :bar)).to_not have_been_called
end
end
end
end
end
|