[英]Original value being updated by injector in test
我正在尝试测试我的可注射组件之一。 我正在使用提供程序为其提供APP_CONFIG
的模拟值。 这是组件的样子:
export let APP_CONFIG = new InjectionToken<any>('app.config');
@Injectable()
export class ConfigService {
private readonly config;
constructor(private injector: Injector) {
this.config = this.injector.get(APP_CONFIG);
}
public update(): void {
this.config.context = 'some value'
}
public get config(): any {
return this.config
}
}
这就是测试设置的样子:
const CONFIG = { context: 'cat' };
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
ConfigService,
{ provide: APP_CONFIG, useValue: CONFIG },
]
});
service = TestBed.inject(AppConfigService);
});
我遇到的问题是,当更新方法中出现this.config = 'some value'
时,它会在我的测试中更新CONFIG
对象中的原始引用。 这在我的测试中造成了问题,因为我无法正确检查this.config
是否已更改,因为它始终等于CONFIG
。
例如:
it('provides updated config after update', () => {
const result: any = service.config;
// CONFIG is currently {context: 'cat'}
service.update();
// Once service.update() occurs CONFIG gets changed to {context: 'some value'} and the following test fails as a result. I expect it to pass because result should be different from the original reference.
expect(result).not.toEqual(CONFIG);
})
因此,这会导致出于比较原因导入CONFIG
对象的任何其他后续测试由于相同原因而失败。
我可以做些什么来防止这种回归? 这是在从 Angular 8 升级到 9 之后开始发生的,所以我不确定是否在引擎盖下进行了一些更改来改变它的工作方式。
看起来您只是在传递相同的引用并将其与自身进行比较。 您需要克隆原始对象。
imo 最简单的方法是使用扩展运算符:
{ provide: APP_CONFIG, useValue: ...CONFIG },
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.