我有一个“Messages”注入表示可以获取用户消息的服务。此类依赖于使用用户凭据登录后端的“数据库”类。
现在我想编写一个测试用例,在此期间有2个用户同时登录,以便自动测试用户1发送的消息是否直接到达用户2的收件箱。
因此,我需要一种方法,用两个不同的,相应的“数据库”实例注入两个不同的“消息”实例。
我尝试了以下内容:
beforeEachProviders(() => [
Messages, Database
]);
beforeEach(inject([Messages], (msg) => {
this.msg1 = msg;
}));
beforeEach(inject([Messages], (msg) => {
this.msg2 = msg;
}));
然而,事实证明,msg1和msg2代表“Messages”的相同实例:
it('testcase', () => {
// this.msg1 == this.msg2;
});
是否可以告诉注入器创建“消息”及其依赖项的不同实例?
答案 0 :(得分:1)
这是Angular DI的工作原理。对于单个提供者,您始终可以获得相同的实例。
作为一种解决方法,您可以注入Injector
并使用
var child = ReflectiveInjector.fromResolvedProviders(
ResolvedReflectiveProvider([Message, Database]), injector);
var msg2 = child.get(Message);
通过这种方式,您应该获得Message
和Database
的不同实例,而其他提供程序可以从父注入器重用(例如MockBackend
,...)`
您也可以使用
var injector = ReflectiveInjector.resolveAndCreate([Message, Database]);
var msg2 = child.get(Message);
但是这样您需要提供所有依赖项,而不仅仅是Message
和Database
,因为没有父项。