为什么角2提供者{useValue:...}克隆对象?

Angular 2高级测试文档:

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);

看起来,我们明确创建的service,userService表单injector.get()和userServiceStub是不同的Object。

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}所有的{provide: someting, useValue: someValue}作为克隆一个新的Object frome someValue ? 为什么DI系统不直接使用someValue

相关github问题的Angular.io。


Angular2 DI为每个提供者维护一个实例。 如果多次提供一个键(类型,字符串或OpaqueToken),您将获得多个实例。

在您的示例中, UserService由测试模块提供,DI将始终从该模块返回相同的实例,但如果具有相同密钥的提供程序更靠近请求依赖项的位置(例如组件本身,则实例从这个提供者将被注入。

要覆盖测试的行为,有不同的方法,具体取决于确切的用例。

一个例子:

TestBed.overrideComponent(comp, {set /* or add */: 
    {providers: [/* new providers here */]}
});

更新

有一个相关的公开问题https://github.com/angular/angular/issues/10788似乎这实际上并不按预期工作。

链接地址: http://www.djcxy.com/p/37343.html

上一篇: why does angular 2 provider {useValue: ...} clone objects?

下一篇: how to route using subdomain in angular2?