gpt4 book ai didi

Angular5 TestBed useValue 似乎没有注入(inject)相同的对象实例

转载 作者:太空狗 更新时间:2023-10-29 17:28:22 28 4
gpt4 key购买 nike

在编写单元测试时,我遇到了奇怪的情况,我不明白问题出在哪里。

我已经准备好重现的短代码:

TestInjectable - 简单的可注入(inject)类

@Injectable()
class TestInjectable {
testProperty = 'testValue';
}

TestComponent - 使用 TestInjectable 的小组件

@Component({
providers: [TestInjectable],
template: ''
})
class TestComponent {
constructor(private injectable: TestInjectable) {
}

doTest() {
return this.injectable.testProperty;
}
}

单元测试

describe('Test TestComponent', () => {
beforeEach(async(() => {
let testInjectableMock: TestInjectable = new TestInjectable();
testInjectableMock.testProperty = 'valueInMock';

TestBed.configureTestingModule({
providers: [{provide: TestInjectable, useValue: testInjectableMock}],
declarations: [TestComponent]
}).compileComponents();
}));

it('should do something', () => {
let fixture: ComponentFixture<TestComponent> = TestBed.createComponent(TestComponent);
let component: TestComponent = fixture.componentInstance;

expect(component.doTest()).toBe('valueInMock');
});
});

因为我有 testInjectableMock 我设置了 valueInMock 我希望组件会返回这个值。问题是组件正在返回默认值 testValue 并且测试失败:

Expected 'testValue' to be 'valueInMock'.

听起来 TestBed 正在创建另一个 TestInjectable 实例,即使我使用 useValue 属性提供实例也是如此。

providers: [{provide: TestInjectable, useValue: testInjectableMock}]

有谁知道我是否遗漏了什么或问题在哪里以及如何说服 TestBed 使用模拟实例?

最佳答案

Angular DI 克隆由 useValue 提供的对象,从它的外观来看,它是否错误:

https://github.com/angular/angular/issues/10788

你应该改用工厂:

TestBed.configureTestingModule({
providers: [{provide: TestInjectable, /*-->*/ useFactory: () => testInjectableMock}],
declarations: [TestComponent]
}).compileComponents();

关于Angular5 TestBed useValue 似乎没有注入(inject)相同的对象实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52409133/

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