gpt4 book ai didi

angular - 在 Angular 2 中测试 ngOnChanges 生命周期钩子(Hook)

转载 作者:太空狗 更新时间:2023-10-29 16:51:39 24 4
gpt4 key购买 nike

给定以下代码,我尝试测试 Angular2 的 ngOnChanges 生命周期钩子(Hook):

import {
it,
inject,
fdescribe,
beforeEachProviders,
} from '@angular/core/testing';

import {TestComponentBuilder} from '@angular/compiler/testing';

import {Component, OnChanges, Input} from '@angular/core';

@Component({
selector: 'test',
template: `<p>{{value}}</p>`,
})
export class TestComponent implements OnChanges {
@Input() value: string;

ngOnChanges(changes: {}): any {
// should be called
}
}

fdescribe('TestComponent', () => {
let tcb: TestComponentBuilder;

beforeEachProviders(() => [
TestComponentBuilder,
TestComponent,
]);

beforeEach(inject([TestComponentBuilder], _tcb => {
tcb = _tcb;
}));

it('should call ngOnChanges', done => {
tcb.createAsync(TestComponent).then(fixture => {
let testComponent: TestComponent = fixture.componentInstance;

spyOn(testComponent, 'ngOnChanges').and.callThrough();

testComponent.value = 'Test';
fixture.detectChanges();

expect(testComponent.ngOnChanges).toHaveBeenCalled();
done();
}).catch(e => done.fail(e));
});
});

不幸的是,测试失败并显示消息 Expected spy ngOnChanges to have been called. 我知道我可以在这个例子中检查 HTML 元素的内容,但我有一些代码需要在 ngOnChanes 生命周期 Hook 内部进行测试,所以这对我来说不是解决方案。我也不想在测试中直接调用 testComponent.ngOnChanges({someMockData});

如何设置测试中的 TestComponent.value 以便调用 ngOnChanges

最佳答案

我想我参加聚会有点晚了,但这可能对将来的某些人有用。

自 Angular 的 RC 5 发布以来,测试发生了一些变化。然而,这里的主要问题是当以编程方式设置输入时,不会调用 ngOnChangesSee this for more info .基本上,OnChanges Hook 仅在通过 View 传递输入时触发

对此的解决方案是让主机组件成为测试组件的父组件,并通过主机组件的模板传递输入。

这是完整的工作代码:

import {Component, OnChanges, Input, ViewChild} from '@angular/core';
import { TestBed } from '@angular/core/testing';

@Component({
selector: 'test',
template: `<p>{{value}}</p>`,
})
export class TestComponent implements OnChanges {
@Input() value: string;

ngOnChanges(changes: {}): any {
// should be called
}
}
/* In the host component's template we will pass the inputs to the actual
* component to test, that is TestComponent in this case
*/
@Component({
selector : `test-host-component`,
template :
`<div><test [value]="valueFromHost"></test></div>`
})
export class TestHostComponent {
@ViewChild(TestComponent) /* using viewChild we get access to the TestComponent which is a child of TestHostComponent */
public testComponent: any;
public valueFromHost: string; /* this is the variable which is passed as input to the TestComponent */
}

describe('TestComponent', () => {

beforeEach(() => {
TestBed.configureTestingModule({declarations: [TestComponent,TestHostComponent]}); /* We declare both the components as part of the testing module */
});

it('should call ngOnChanges', ()=> {
const fixture = TestBed.createComponent(TestHostComponent);
const hostComponent = fixture.componentInstance;
hostComponent.valueFromHost = 'Test';
const component = hostComponent.testComponent;
spyOn(component, 'ngOnChanges').and.callThrough();
fixture.detectChanges();
expect(component.ngOnChanges).toHaveBeenCalled();
})


});

关于angular - 在 Angular 2 中测试 ngOnChanges 生命周期钩子(Hook),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37408801/

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