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
|
import Registry from '../registry';
describe("Registry", () => {
class Item { }
class Dependent {
constructor(item) {
this.item = item;
}
}
class VeryDependent {
constructor(item, dependent) {
this.item = item;
this.dependent = dependent;
}
}
let subject = null;
beforeEach(() => {
subject = new Registry();
});
describe("#resolve", () => {
it("resolves an instance", () => {
subject.register('item', () => { return new Item() })
expect(subject.resolve('item')).toBeInstanceOf(Item);
});
it ("resolves an instance with a dependency", () => {
subject.register('item', () => { return new Item() });
subject.register('dependent', (container) => {
return new Dependent(container.resolve('item'));
});
let result = subject.resolve('dependent');
expect(result).toBeInstanceOf(Dependent);
expect(result.item).toBeInstanceOf(Item);
});
it ("resolves a singleton", () => {
subject.register('item', () => { return new Item() }).asSingleton();
let result = subject.resolve('item')
expect(result).toBe(subject.resolve('item'));
});
it ("resolves the constructor dependencies", () => {
var item = new Item();
subject.register('item', () => item);
subject.register('dependent', Dependent);
subject.register('veryDependent', VeryDependent);
let result = subject.resolve('veryDependent');
expect(result).toBeInstanceOf(VeryDependent);
expect(result.dependent).toBeInstanceOf(Dependent);
expect(result.item).toEqual(item);
})
it ("resolves constructor dependencies for a singleton", () => {
var item = new Item();
subject.register('item', () => item);
subject.register('dependent', Dependent).asSingleton();
let result = subject.resolve('dependent');
let other = subject.resolve('dependent');
expect(result).toBe(other);
});
it ("resolves a constructor with zero dependencies", () => {
subject.register('item', Item);
expect(subject.resolve('item')).toBeInstanceOf(Item);
});
it("raises an error when a component is not registered", () => {
expect(() => {
subject.resolve('unknown');
}).toThrow(/"unknown" is not registered/);
});
});
describe("#resolveAll", () => {
beforeEach(() => {
subject.register('item', () => { return "0"; });
subject.register('item', () => { return "1"; });
});
it ("resolves all instances of the given key", () => {
let results = subject.resolveAll('item');
expect(results.length).toEqual(2);
expect(results[0]).toEqual("0");
expect(results[1]).toEqual("1");
});
});
});
|