【发布时间】:2018-09-19 15:14:11
【问题描述】:
在编写单元测试时,我遇到了奇怪的情况,我不明白问题出在哪里。
我已经准备了用于复制的短代码:
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 使用模拟实例?
【问题讨论】:
-
您的 TestComponent 中哪里有 setTestProperty ?
-
我没有。它只是被调用来为模拟实例 testInjectableMock.setTestProperty('valueInMock'); 设置新值;
-
如果您再次检查示例,模拟实例上的 testProperty 将更改为新值。我希望在组件中注入模拟实例,但似乎不是。
-
我编辑了问题并删除了 setter 以避免这种混淆。最初的问题仍然存在......
-
对不起,我第一次看不太清楚...
标签: angular unit-testing angular5