diff --git a/src/spectator/harness.cr b/src/spectator/harness.cr index 88873e3..70ad610 100644 --- a/src/spectator/harness.cr +++ b/src/spectator/harness.cr @@ -27,8 +27,7 @@ module Spectator # The *example* argument will be the example to run. # The result returned from `Example#run` will be returned. def self.run(example : Example) : Result - @@current = harness = new(example) - harness.mocks.prepare(example.group.context) + @@current = new(example) example.run ensure @@current = nil @@ -37,7 +36,7 @@ module Spectator # Retrieves the current running example. getter example : Example - getter mocks = Mocks::Registry.new + getter mocks : Mocks::Registry # Retrieves the group for the current running example. def group @@ -60,6 +59,7 @@ module Spectator # The example the harness is for should be passed in. private def initialize(@example) @reporter = Expectations::ExpectationReporter.new + @mocks = Mocks::Registry.new(@example.group.context.stubs) end end end diff --git a/src/spectator/mocks/registry.cr b/src/spectator/mocks/registry.cr index d19119f..31c956b 100644 --- a/src/spectator/mocks/registry.cr +++ b/src/spectator/mocks/registry.cr @@ -10,8 +10,12 @@ module Spectator::Mocks @all_instances = {} of String => Entry @entries = {} of Key => Entry - def prepare(context : TestContext) : Nil - # TODO + def initialize(default_stubs) + @all_instances = default_stubs.map do |k, v| + entry = Entry.new + entry.stubs.concat(v) + {k, entry} + end.to_h end def reset : Nil diff --git a/src/spectator/spec_builder.cr b/src/spectator/spec_builder.cr index 07ddf8c..9e199c2 100644 --- a/src/spectator/spec_builder.cr +++ b/src/spectator/spec_builder.cr @@ -96,9 +96,8 @@ module Spectator @@stack.current.add_post_condition(block) end - def add_double(id : Symbol, double_type : Double.class) : Nil - double_factory = DoubleFactory.new(double_type) - current_group.add_double(id, double_factory) + def add_default_stub(*args) : Nil + @@stack.current.add_default_stub(*args) end # Builds the entire spec and returns it as a test suite. diff --git a/src/spectator/spec_builder/example_group_builder.cr b/src/spectator/spec_builder/example_group_builder.cr index f9ed5bf..90034b4 100644 --- a/src/spectator/spec_builder/example_group_builder.cr +++ b/src/spectator/spec_builder/example_group_builder.cr @@ -14,6 +14,7 @@ module Spectator::SpecBuilder @around_each_hooks = Deque(::SpectatorTest, Proc(Nil) ->).new @pre_conditions = Deque(TestMetaMethod).new @post_conditions = Deque(TestMetaMethod).new + @default_stubs = {} of String => Deque(Mocks::MethodStub) def add_child(child : Child) @children << child @@ -47,6 +48,12 @@ module Spectator::SpecBuilder @post_conditions << hook end + def add_default_stub(type : T.class, stub : Mocks::MethodStub) forall T + key = type.name + @default_stubs[key] = Dequeue.new unless @default_stubs.has_key?(key) + @default_stubs[key] << stub + end + private def build_hooks ExampleHooks.new( @before_all_hooks.to_a, diff --git a/src/spectator/spec_builder/nested_example_group_builder.cr b/src/spectator/spec_builder/nested_example_group_builder.cr index dc08cff..6d7bb77 100644 --- a/src/spectator/spec_builder/nested_example_group_builder.cr +++ b/src/spectator/spec_builder/nested_example_group_builder.cr @@ -7,7 +7,7 @@ module Spectator::SpecBuilder end def build(parent_group) - context = TestContext.new(parent_group.context, build_hooks, build_conditions, parent_group.context.values) + context = TestContext.new(parent_group.context, build_hooks, build_conditions, parent_group.context.values, @default_stubs) NestedExampleGroup.new(@description, @source, parent_group, context).tap do |group| group.children = children.map do |child| child.build(group).as(ExampleComponent) diff --git a/src/spectator/spec_builder/root_example_group_builder.cr b/src/spectator/spec_builder/root_example_group_builder.cr index 02f4914..3dbbcf7 100644 --- a/src/spectator/spec_builder/root_example_group_builder.cr +++ b/src/spectator/spec_builder/root_example_group_builder.cr @@ -4,7 +4,7 @@ require "./example_group_builder" module Spectator::SpecBuilder class RootExampleGroupBuilder < ExampleGroupBuilder def build - context = TestContext.new(nil, build_hooks, build_conditions, TestValues.empty) + context = TestContext.new(nil, build_hooks, build_conditions, TestValues.empty, {} of String => Deque(Mocks::MethodStub)) RootExampleGroup.new(context).tap do |group| group.children = children.map do |child| child.build(group).as(ExampleComponent) diff --git a/src/spectator/spec_builder/sample_example_group_builder.cr b/src/spectator/spec_builder/sample_example_group_builder.cr index eacd596..955ac7a 100644 --- a/src/spectator/spec_builder/sample_example_group_builder.cr +++ b/src/spectator/spec_builder/sample_example_group_builder.cr @@ -9,7 +9,7 @@ module Spectator::SpecBuilder def build(parent_group) values = parent_group.context.values collection = @collection_builder.call(values) - context = TestContext.new(parent_group.context, build_hooks, build_conditions, values) + context = TestContext.new(parent_group.context, build_hooks, build_conditions, values, @default_stubs) NestedExampleGroup.new(@description, @source, parent_group, context).tap do |group| group.children = collection.map do |element| build_sub_group(group, element).as(ExampleComponent) @@ -19,7 +19,7 @@ module Spectator::SpecBuilder private def build_sub_group(parent_group, element) values = parent_group.context.values.add(@id, @description.to_s, element) - context = TestContext.new(parent_group.context, ExampleHooks.empty, ExampleConditions.empty, values) + context = TestContext.new(parent_group.context, ExampleHooks.empty, ExampleConditions.empty, values, {} of String => Deque(Mocks::MethodStub)) NestedExampleGroup.new("#{@label} = #{element.inspect}", @source, parent_group, context).tap do |group| group.children = children.map do |child| child.build(group).as(ExampleComponent) diff --git a/src/spectator/test_context.cr b/src/spectator/test_context.cr index 8d16fee..fd735e2 100644 --- a/src/spectator/test_context.cr +++ b/src/spectator/test_context.cr @@ -5,7 +5,13 @@ module Spectator class TestContext getter values - def initialize(@parent : TestContext?, @hooks : ExampleHooks, @conditions : ExampleConditions, @values : TestValues) + getter stubs : Hash(String, Deque(Mocks::MethodStub)) + + def initialize(@parent : TestContext?, + @hooks : ExampleHooks, + @conditions : ExampleConditions, + @values : TestValues, + @stubs : Hash(String, Deque(Mocks::MethodStub))) @before_all_hooks_run = false @after_all_hooks_run = false end