При написании модульных тестов я сталкиваюсь со странным случаем, для которого я не понимаю, в чем проблема.
Я подготовил короткий код для воспроизведения:
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
использовать макетный экземпляр?