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
|
require 'spec_helper'
module Bogus
describe OverwritesMethods do
let(:method_stringifier) { MethodStringifier.new }
let(:makes_substitute_methods) { isolate(MakesSubstituteMethods) }
let(:overwriter) { isolate(OverwritesMethods) }
let(:object) { SampleOfOverwriting.new }
context "with regular objects" do
class SampleOfOverwriting
def greet(name)
"Hello #{name}"
end
def wave(part_of_body = "hand", speed = "slowly")
"I'm waving my #{part_of_body} #{speed}"
end
end
before do
overwriter.overwrite(object, :greet)
end
it "does not change the method signature" do
expect(object.method(:greet).arity).to eq(1)
end
it "does not change the method signature" do
expect {
object.greet("John", "Paul")
}.to raise_error(ArgumentError)
end
it "adds interaction recording to the overwritten object" do
object.greet("John")
expect(object).to Bogus.have_received.greet("John")
expect(object).not_to Bogus.have_received.greet("Paul")
end
it "can reset the overwritten methods" do
overwriter.reset(object)
expect(object.greet("John")).to eq("Hello John")
end
it "is imdepotent when overwriting" do
overwriter.overwrite(object, :greet)
overwriter.overwrite(object, :greet)
overwriter.overwrite(object, :greet)
overwriter.reset(object)
expect(object.greet("John")).to eq("Hello John")
end
end
context "with objects that use method missing" do
class UsesMethodMissing
def respond_to?(name)
name == :greet
end
def method_missing(name, *args, &block)
"the original return value"
end
end
let(:object) { UsesMethodMissing.new }
before do
overwriter.overwrite(object, :greet)
end
it "can overwrite the non-existent methods" do
expect(object.methods).to include(:greet)
end
it "can be reset back to the original state" do
overwriter.overwrite(object, :greet)
overwriter.overwrite(object, :greet)
overwriter.reset(object)
expect(object.greet).to eq("the original return value")
end
end
context "with fakes" do
let(:fake) { Samples::FooFake.new }
it "does nothing because fakes methods already work as we need" do
overwriter.overwrite(fake, :foo_bar)
expect(fake).not_to respond_to(:foo_bar)
end
it "does not reset fakes, because there is nothing to reset" do
expect {
overwriter.reset(fake)
}.not_to raise_error
end
end
end
end
|