角2先进的测试文档:角2提供程序为什么{useValue:...}克隆对象?
userServiceStub = {
isLoggedIn: true,
user: { name: 'Test User'}
};
TestBed.configureTestingModule({
declarations: [ WelcomeComponent ],
// providers: [ UserService ] // NO! Don't provide the real service!
// Provide a test-double instead
providers: [ {provide: UserService, useValue: userServiceStub } ]
});
fixture = TestBed.createComponent(WelcomeComponent);
comp = fixture.componentInstance;
// UserService actually injected into the component
userService = fixture.debugElement.injector.get(UserService);
componentUserService = userService;
// UserService from the root injector
userService = TestBed.get(UserService);
似乎从我们明确创建的服务,userService形式injector.get()和userServiceStub是不同的对象。
it('stub object and injected UserService should not be the same',() => {
expect(userServiceStub === userService).toBe(false);
// Changing the stub object has no effect on the injected service
userServiceStub.isLoggedIn = false;
expect(userService.isLoggedIn).toBe(true);
});
的文档说,userService
这里是userServiceStub
副本。这是否意味着Angular 2 DI会将所有{provide: someting, useValue: someValue}
视为克隆新对象frome someValue
?为什么DI系统不直接使用someValue
?
Angular.io相关github上issue。
您是否在WelcomeComponent中提供了'UserService'? –
@GünterZöchbauer我在root appModule中提供普通的userService。我的问题是,为什么不直接在这里注入userServiceStub,而是将它克隆。 appModule中似乎没有原始的userService。 – MaxLXJ
我没有注入一个克隆。 DI从不克隆。很难分辨您的代码究竟发生了什么。你能否提供一个Plunker来重现? –