-
Notifications
You must be signed in to change notification settings - Fork 223
/
Copy pathdependency_injection_test.rb
124 lines (95 loc) · 4.01 KB
/
dependency_injection_test.rb
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
require 'test_helper'
class TestDependencyOne
attr_reader :arg
def initialize(arg = nil)
@arg = arg
end
end
class TestDependencyTwo
attr_reader :arg
def initialize(arg = nil)
@arg = arg
end
end
class TestContainer < Proxy::DependencyInjection::Container; end
module TestInjectors
include Proxy::DependencyInjection::Accessors
def container_instance
TestContainer.instance
end
end
class TestDependencies
extend Proxy::DependencyInjection::Wiring
def self.container_instance
TestContainer.instance
end
dependency :test_dependency_one, TestDependencyOne
dependency :test_dependency_two, -> { TestDependencyOne.new("a_parameter") }
singleton_dependency :singleton_dependency, TestDependencyTwo
singleton_dependency :singleton_dependency_two, -> { TestDependencyTwo.new("a_parameter") }
end
class TestDependsOne
extend TestInjectors
inject_attr :test_dependency_one, :instance_var
inject_attr :singleton_dependency, :singleton_var
end
class TestDependsTwo
extend TestInjectors
inject_attr :singleton_dependency, :singleton_var
end
class DependencyInjectionTest < Test::Unit::TestCase
def test_can_locate_dependency
assert TestContainer.instance.get_dependency(:test_dependency_one)
assert TestContainer.instance.get_dependency(:singleton_dependency)
end
def test_raises_error_when_dependency_cannot_be_found
assert_raises RuntimeError do
TestContainer.instance.get_dependency(:non_existent)
end
end
def test_instance_var_dependency_uses_correct_wrapper
assert_instance_of Proxy::DependencyInjection::InstanceVariableWrapper, TestContainer.instance.dependencies[:test_dependency_one]
end
def test_instance_var_dependency_instantiates_correct_class
assert_instance_of TestDependencyOne, TestContainer.instance.get_dependency(:test_dependency_one)
end
def test_instance_var_dependency_defined_by_lambda
assert_instance_of TestDependencyOne, TestContainer.instance.get_dependency(:test_dependency_two)
end
def test_instance_var_dependency_lambda_receives_container_as_parameter
assert_equal "a_parameter", TestContainer.instance.get_dependency(:test_dependency_two).arg
end
def test_singleton_var_dependency_uses_correct_wrapper
assert_instance_of Proxy::DependencyInjection::SingletonWrapper, TestContainer.instance.dependencies[:singleton_dependency]
end
def test_singleton_var_dependency_instantiates_correct_class
assert_instance_of TestDependencyTwo, TestContainer.instance.get_dependency(:singleton_dependency)
end
def test_singleton_var_dependency_defined_by_lambda
assert_instance_of TestDependencyTwo, TestContainer.instance.get_dependency(:singleton_dependency_two)
end
def test_singleton_var_dependency_lambda_receives_container_as_parameter
assert_equal "a_parameter", TestContainer.instance.get_dependency(:singleton_dependency_two).arg
end
def test_instance_var_wiring
assert_instance_of TestDependencyOne, TestDependsOne.new.instance_var
end
def test_singleton_var_wiring
assert_instance_of TestDependencyTwo, TestDependsOne.new.singleton_var
end
def test_instance_var_dependency_is_instantiated_for_every_instance_of_class
dependency_one_first_instance = TestDependsOne.new.instance_var
dependency_one_second_instance = TestDependsOne.new.instance_var
assert dependency_one_first_instance != dependency_one_second_instance
end
def test_singleton_var_dependency_is_reused_for_each_instance_of_class
singleton_dependency_first_instance = TestDependsOne.new.singleton_var
singleton_dependency_second_instancee = TestDependsOne.new.singleton_var
assert_equal singleton_dependency_first_instance, singleton_dependency_second_instancee
end
def test_singleton_var_dependency_is_reused_for_instances_of_different_classes
singleton_dependency_first_instance = TestDependsOne.new.singleton_var
singleton_dependency_second_instancee = TestDependsTwo.new.singleton_var
assert_equal singleton_dependency_first_instance, singleton_dependency_second_instancee
end
end