/
QueueInjectionExampleTest.cs
135 lines (113 loc) · 3.61 KB
/
QueueInjectionExampleTest.cs
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
125
126
127
128
129
130
131
132
133
134
135
using System.Collections.Generic;
using Zenject;
using NUnit.Framework;
namespace Tests
{
[TestFixture]
public class QueueInjectionExampleTest : ZenjectUnitTestFixture
{
private const string Group01 = "GROUP_01";
private const string Group02 = "GROUP_02";
[Inject(Id = Group01)]
private Queue<string> _targetMessageQueue01 = null;
[Inject(Id = Group02)]
private Queue<string> _targetMessageQueue02 = null;
[Inject]
private DITarget01 _target01 = null;
[Inject]
private DITarget01Ex _target01Ex = null;
[Inject]
private DITarget02 _target02 = null;
[Test]
public void AsCached_CollectionインスタンスがDI先で異なること()
{
// setup
Container
.Bind<Queue<string>>() // Queueは残念ながら専用interfaceなし
.WithId(Group01)
// .To<Queue<string>>() // ContractTypeとResultTypeが同じならToは不要
.AsCached();
Container
.Bind<Queue<string>>()
.WithId(Group02)
.AsCached();
Container
.Bind<DITarget01>()
.AsSingle(); // DI先のクラスのScopeは気にしない(確認用のため何でも良い)
Container
.Bind<DITarget01Ex>()
.AsSingle(); // DI先のクラスのScopeは気にしない(確認用のため何でも良い)
Container
.Bind<DITarget02>()
.AsSingle();
Container.Inject(this);
// when
_target01.Enqueue();
_target01Ex.Enqueue();
_target02.Enqueue();
// then
Assert.AreEqual(2, _targetMessageQueue01.Count);
Assert.AreEqual(1, _targetMessageQueue02.Count);
// GROUP_01
{
var message = _targetMessageQueue01.Dequeue();
Assert.AreEqual("Hello", message);
}
{
var message = _targetMessageQueue01.Dequeue();
Assert.AreEqual("Hey!", message);
}
// GROUP_02
{
var message = _targetMessageQueue02.Dequeue();
Assert.AreEqual("Hi...", message);
}
}
/// <summary>
/// GROUP_01用
/// </summary>
public class DITarget01
{
private Queue<string> _queue;
// MonoBehaviourでない場合はIdは引数で指定
public DITarget01([Inject(Id = Group01)] Queue<string> queue)
{
_queue = queue;
}
public void Enqueue()
{
_queue.Enqueue("Hello");
}
}
/// <summary>
/// GROUP_01用
/// </summary>
public class DITarget01Ex
{
private Queue<string> _queue;
public DITarget01Ex([Inject(Id = Group01)] Queue<string> queue)
{
_queue = queue;
}
public void Enqueue()
{
_queue.Enqueue("Hey!");
}
}
/// <summary>
/// GROUP_02用
/// </summary>
public class DITarget02
{
private Queue<string> _queue;
public DITarget02([Inject(Id = Group02)] Queue<string> queue)
{
_queue = queue;
}
public void Enqueue()
{
_queue.Enqueue("Hi...");
}
}
}
}