gpt4 book ai didi

javascript - 为什么 angular 2 provider {useValue : . ..} 克隆对象?

转载 作者:可可西里 更新时间:2023-11-01 02:44:28 35 4
gpt4 key购买 nike

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

看来我们显式创建的服务、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);
});

文档说这里的 userServiceuserServiceStub 的副本。这是否意味着 Angular 2 DI 将所有 {provide: someting, useValue: someValue} 视为从 someValue 克隆一个新对象?为什么 DI 系统不直接使用 someValue

相关github issue Angular.io 的。

最佳答案

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

在您的示例中,UserService 由测试模块提供,DI 将始终从该模块返回相同的实例,但是如果有一个具有相同键的提供者更接近请求依赖项的位置(例如在组件本身上,然后将注入(inject)来自该提供者的实例。

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

一个例子:

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

更新

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

关于javascript - 为什么 angular 2 provider {useValue : . ..} 克隆对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40882395/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com