angular - Angular5 TestBed useValue 似乎没有注入相同的对象实例
问题描述
在编写单元测试时,我遇到了奇怪的情况,我不明白问题出在哪里。
我准备了用于复制的短代码:
TestInjectable - 简单的可注入类
@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
,它是默认值,并且测试失败:
预期“testValue”为“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();
推荐阅读
- python - Python: Condense DataFrame column values into a single cell
- python - 从分类数据类型列中提取平均值
- sql - Redshift:将文本转换为时间戳
- sharepoint - 如何阻止页面在 SharePoint 中进行任何内容修改
- php - 在 HTML 网页上制作从 txt 文件中提取数据的动态图
- javascript - 如何调用嵌套在 forEach 循环中的 Javascript 函数
- c++ - 在 Eclipse 中设置焦点
- c++ - 为什么我的嵌套 If 语句没有生成 cout?
- python-3.x - 如何在 API 中使用参数访问 URL
- xml - 如何使用 API 管理的 Set-body Policy 为 XML 元素设置值