mirror of
https://gitea.invidious.io/iv-org/shard-spectator.git
synced 2024-08-15 00:53:35 +00:00
Add mock registry fetch method
Solves the issue of pre-populating a mock with stubs.
This commit is contained in:
parent
7923eb3ad0
commit
86b49dc20e
3 changed files with 41 additions and 4 deletions
|
@ -2,16 +2,16 @@ require "../../spec_helper"
|
||||||
|
|
||||||
Spectator.describe Spectator::ReferenceMockRegistry do
|
Spectator.describe Spectator::ReferenceMockRegistry do
|
||||||
subject(registry) { described_class.new }
|
subject(registry) { described_class.new }
|
||||||
|
let(obj) { "foobar" }
|
||||||
let(stub) { Spectator::ValueStub.new(:test, 42) }
|
let(stub) { Spectator::ValueStub.new(:test, 42) }
|
||||||
|
let(no_stubs) { [] of Spectator::Stub }
|
||||||
|
|
||||||
it "initially has no stubs" do
|
it "initially has no stubs" do
|
||||||
obj = "foobar"
|
|
||||||
expect(registry[obj]).to be_empty
|
expect(registry[obj]).to be_empty
|
||||||
end
|
end
|
||||||
|
|
||||||
it "stores stubs for an object" do
|
it "stores stubs for an object" do
|
||||||
obj = "foobar"
|
expect { registry[obj] << stub }.to change { registry[obj] }.from(no_stubs).to([stub])
|
||||||
expect { registry[obj] << stub }.to change { registry[obj] }.from([] of Spectator::Stub).to([stub])
|
|
||||||
end
|
end
|
||||||
|
|
||||||
it "isolates stubs between different objects" do
|
it "isolates stubs between different objects" do
|
||||||
|
@ -20,4 +20,22 @@ Spectator.describe Spectator::ReferenceMockRegistry do
|
||||||
registry[obj2] << Spectator::ValueStub.new(:obj2, 42)
|
registry[obj2] << Spectator::ValueStub.new(:obj2, 42)
|
||||||
expect { registry[obj1] << stub }.to_not change { registry[obj2] }
|
expect { registry[obj1] << stub }.to_not change { registry[obj2] }
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "#fetch" do
|
||||||
|
it "retrieves existing stubs" do
|
||||||
|
registry[obj] << stub
|
||||||
|
expect(registry.fetch(obj) { no_stubs }).to eq([stub])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "stores stubs on the first retrieval" do
|
||||||
|
expect(registry.fetch(obj) { [stub] of Spectator::Stub }).to eq([stub])
|
||||||
|
end
|
||||||
|
|
||||||
|
it "isolates stubs between different objects" do
|
||||||
|
obj1 = "foo"
|
||||||
|
obj2 = "bar"
|
||||||
|
registry[obj2] << Spectator::ValueStub.new(:obj2, 42)
|
||||||
|
expect { registry.fetch(obj2) { no_stubs } }.to_not change { registry[obj2] }
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -59,7 +59,15 @@ module Spectator
|
||||||
{% end %}
|
{% end %}
|
||||||
|
|
||||||
private def _spectator_stubs
|
private def _spectator_stubs
|
||||||
@@_spectator_mock_registry[self]
|
@@_spectator_mock_registry.fetch(self) do
|
||||||
|
{% begin %}
|
||||||
|
[
|
||||||
|
{% for key, value in value_methods %}
|
||||||
|
::Spectator::ValueStub.new({{key.id.symbolize}}, {{value}}),
|
||||||
|
{% end %}
|
||||||
|
] of ::Spectator::Stub
|
||||||
|
{% end %}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
# Returns the mock's name formatted for user output.
|
# Returns the mock's name formatted for user output.
|
||||||
|
|
|
@ -23,5 +23,16 @@ module Spectator
|
||||||
key = Box.box(object)
|
key = Box.box(object)
|
||||||
@object_stubs[key]
|
@object_stubs[key]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Retrieves all stubs defined for a mocked object.
|
||||||
|
#
|
||||||
|
# Yields to the block on the first retrieval.
|
||||||
|
# This allows a mock to populate the registry with initial stubs.
|
||||||
|
def fetch(object : Reference, & : -> Array(Stub))
|
||||||
|
key = Box.box(object)
|
||||||
|
@object_stubs.fetch(key) do
|
||||||
|
@object_stubs[key] = yield
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue