max*_*der 10 javascript typescript angular
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);
Run Code Online (Sandbox Code Playgroud)
看来我们显式创建的服务,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);
});
Run Code Online (Sandbox Code Playgroud)
医生说userService这里是副本userServiceStub.这是否意味着Angular 2 DI将全部{provide: someting, useValue: someValue}视为克隆一个新的Object frome someValue?为什么DI系统不someValue直接使用?
Angular.io的相关github 问题.
Angular2 DI为每个提供程序维护一个实例。如果多次提供键(类型,字符串或OpaqueToken),则将获得多个实例。
在您的示例UserService中,测试模块提供了该示例,并且DI始终会从该模块返回相同的实例,但是如果有一个提供者具有与请求依赖关系更近的相同键(例如,在组件本身上,则从该提供者将被注入。
要覆盖测试行为,有不同的方法,具体取决于确切的用例。
一个例子:
TestBed.overrideComponent(comp, {set /* or add */:
{providers: [/* new providers here */]}
});
Run Code Online (Sandbox Code Playgroud)
更新资料
有一个相关的未解决问题https://github.com/angular/angular/issues/10788 似乎实际上并没有按预期工作。
| 归档时间: |
|
| 查看次数: |
1035 次 |
| 最近记录: |