From 94e210c3065ce2f8ea9dfab7eb845e25120cfe71 Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Mon, 11 Nov 2019 23:40:08 -0700 Subject: [PATCH] Implement null doubles --- src/spectator/dsl/mocks.cr | 30 ++++++++++++++++++++++++++++-- src/spectator/mocks/double.cr | 4 +++- 2 files changed, 31 insertions(+), 3 deletions(-) diff --git a/src/spectator/dsl/mocks.cr b/src/spectator/dsl/mocks.cr index 0bd6320..3982756 100644 --- a/src/spectator/dsl/mocks.cr +++ b/src/spectator/dsl/mocks.cr @@ -10,8 +10,34 @@ module Spectator::DSL end {% else %} class Double{{name.id}} < ::Spectator::Mocks::Double - def initialize - super({{name.id.symbolize}}) + def initialize(null = false) + super({{name.id.symbolize}}, null) + end + + def as_null_object + Double{{name.id}}.new(true) + end + + {{block.body}} + end + {% end %} + end + + macro null_double(name, **stubs, &block) + {% if block.is_a?(Nop) %} + Double{{name.id}}.new(true).tap do |%double| + {% for name, value in stubs %} + allow(%double).to receive({{name.id}}).and_return({{value}}) + {% end %} + end + {% else %} + class Double{{name.id}} < ::Spectator::Mocks::Double + def initialize(null = true) + super({{name.id.symbolize}}, null) + end + + def as_null_object + Double{{name.id}}.new(true) end {{block.body}} diff --git a/src/spectator/mocks/double.cr b/src/spectator/mocks/double.cr index ac20348..d546b37 100644 --- a/src/spectator/mocks/double.cr +++ b/src/spectator/mocks/double.cr @@ -4,7 +4,7 @@ require "./unexpected_message_error" module Spectator::Mocks abstract class Double - def initialize(@spectator_double_name : Symbol) + def initialize(@spectator_double_name : Symbol, @null = false) end private macro stub(definition, &block) @@ -74,6 +74,8 @@ module Spectator::Mocks end macro method_missing(call) + return self if @null + raise ::Spectator::Mocks::UnexpectedMessageError.new("#{self} received unexpected message {{call.name}}") end