forked from uber-go/dig
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathinject_test.go
101 lines (89 loc) · 2.29 KB
/
inject_test.go
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
package dig_test
import (
"github.com/stretchr/testify/require"
"go.uber.org/dig"
"testing"
)
type IA interface {
A() *TA
}
type C struct {
Name string
}
type TA struct {
C *C `inject:"ca"`
B *TB `inject:"tb"`
}
func (t *TA) A() *TA { return t }
func NewIA1() IA { return NewTA() }
func NewTA() *TA { return &TA{} }
type TB struct {
C *C `inject:"cb"`
A *TA `inject:"ta"`
A2 *TA `inject:"ta2"`
IA IA `inject:""`
}
func NewTB() *TB { return &TB{} }
func TestDigInject(t *testing.T) {
c := dig.New()
require.NoError(t, c.Provide(func() *C { return &C{Name: "ca"} }, dig.Name("ca")))
require.NoError(t, c.Provide(func() *C { return &C{Name: "cb"} }, dig.Name("cb")))
require.NoError(t, c.Provide(NewTA, dig.Name("ta")))
require.NoError(t, c.Provide(NewTA, dig.Name("ta2")))
require.NoError(t, c.Provide(NewTB, dig.Name("tb")))
require.NoError(t, c.Provide(NewIA1))
type TTIn struct {
dig.In // 使用 dig.In 需配合 name 标签使用
A *TA `name:"ta"`
B *TB `name:"tb"`
}
require.NoError(t, c.Invoke(func(tt TTIn) {
require.NotNil(t, tt.A)
require.NotNil(t, tt.B)
require.NotNil(t, tt.A.B)
require.NotNil(t, tt.A.C)
require.NotNil(t, tt.B.A)
require.NotNil(t, tt.B.C)
require.Equal(t, "ca", tt.A.C.Name)
require.Equal(t, "cb", tt.B.C.Name)
require.Equal(t, tt.A, tt.B.A)
}))
type TT struct {
A *TA `inject:"ta"`
B *TB `inject:"tb"`
}
require.NoError(t, c.Provide(func() *TT { return &TT{} }))
require.NoError(t, c.Invoke(func(tt *TT) {
require.NotNil(t, tt.A)
require.NotNil(t, tt.B)
require.NotNil(t, tt.A.B)
require.NotNil(t, tt.A.C)
require.NotNil(t, tt.B.A)
require.NotNil(t, tt.B.C)
require.NotNil(t, tt.B.A2)
require.NotNil(t, tt.B.A2.B)
require.NotNil(t, tt.B.A2.C)
require.NotNil(t, tt.B.IA)
require.NotNil(t, tt.B.IA.A())
require.NotNil(t, tt.B.IA.A().B)
require.Equal(t, "ca", tt.A.C.Name)
require.Equal(t, "cb", tt.B.C.Name)
require.Equal(t, tt.A, tt.B.A)
}))
}
//func TestInject(t *testing.T) {
// graph := inject.Graph{}
//
// a := NewTA()
// b := NewTB()
//
// require.NoError(t, graph.Provide(
// &inject.Object{Value: a},
// &inject.Object{Value: b},
// &inject.Object{Value: &C{Name: "c1"}},
// ))
// require.NoError(t, graph.Populate())
//
// require.Equal(t, "c1", a.C.Name)
// require.Equal(t, "c1", b.C.Name)
//}