diff --git a/spec/spectator/mocks/mock_spec.cr b/spec/spectator/mocks/mock_spec.cr index aa8fabb..55fab68 100644 --- a/spec/spectator/mocks/mock_spec.cr +++ b/spec/spectator/mocks/mock_spec.cr @@ -15,55 +15,58 @@ class Thing2 end Spectator.describe Spectator::Mock do - # describe "#define_subclass" do - # class Thing - # def method1 - # 42 - # end + describe "#define_subclass" do + class Thing + def method1 + 42 + end - # def method2 - # :original - # end + def method2 + :original + end - # def method3 - # "original" - # end - # end + def method3 + "original" + end + end - # Spectator::Mock.define_subclass(Thing, MockThing, :mock_name, method1: 123) do - # stub def method2 - # :stubbed - # end - # end + Spectator::Mock.define_subclass(Thing, MockThing, :mock_name, method1: 123) do + stub def method2 + :stubbed + end + end - # let(thing) { MockThing.new } + let(thing) { MockThing.new } - # it "defines a subclass of the mocked type" do - # expect(MockThing).to be_lt(Thing) - # end + it "defines a subclass of the mocked type" do + expect(MockThing).to be_lt(Thing) + end - # it "overrides responses from methods with keyword arguments" do - # expect(thing.method1).to eq(123) - # end + it "overrides responses from methods with keyword arguments" do + expect(thing.method1).to eq(123) + end - # it "overrides responses from methods defined in the block" do - # expect(thing.method2).to eq(:stubbed) - # end + it "overrides responses from methods defined in the block" do + expect(thing.method2).to eq(:stubbed) + end - # it "allows methods to be stubbed" do - # stub1 = Spectator::ValueStub.new(:method1, 777) - # stub2 = Spectator::ValueStub.new(:method2, :override) - # stub3 = Spectator::ValueStub.new(:method3, "stubbed") + it "allows methods to be stubbed" do + stub1 = Spectator::ValueStub.new(:method1, 777) + stub2 = Spectator::ValueStub.new(:method2, :override) + stub3 = Spectator::ValueStub.new(:method3, "stubbed") - # aggregate_failures do - # expect { thing._spectator_define_stub(stub1) }.to change { thing.method1 }.to(777) - # expect { thing._spectator_define_stub(stub2) }.to change { thing.method2 }.to(:override) - # expect { thing._spectator_define_stub(stub3) }.to change { thing.method3 }.from("original").to("stubbed") - # end - # end - # end + aggregate_failures do + expect { thing._spectator_define_stub(stub1) }.to change { thing.method1 }.to(777) + expect { thing._spectator_define_stub(stub2) }.to change { thing.method2 }.to(:override) + expect { thing._spectator_define_stub(stub3) }.to change { thing.method3 }.from("original").to("stubbed") + end + end + end describe "#inject" do + # For some reason, Thing2 is not visible to `inject` below when defined here. + # Thing2's definition is outside of the spec to get around this. + context "with a class" do Spectator::Mock.inject(Thing2, :mock_name, method1: 123) do stub def method2 diff --git a/src/spectator/mocks/stubbable.cr b/src/spectator/mocks/stubbable.cr index 3bd7317..9a1dce5 100644 --- a/src/spectator/mocks/stubbable.cr +++ b/src/spectator/mocks/stubbable.cr @@ -318,7 +318,7 @@ module Spectator {% if method.double_splat %}**{{method.double_splat}}, {% end %} {% if method.block_arg %}&{{method.block_arg}}{% elsif method.accepts_block? %}&{% end %} ){% if method.return_type %} : {{method.return_type}}{% end %}{% if !method.free_vars.empty? %} forall {{method.free_vars.splat}}{% end %} - previous_def{% if method.accepts_block? %} { |*%yargs| yield *%yargs }{% end %} + {% if type == @type %}previous_def{% else %}super{% end %}{% if method.accepts_block? %} { |*%yargs| yield *%yargs }{% end %} end {% end %} end