在測試具有帶有<ng-content>
的帶有插槽的角度組件時,我們沒有 明確的方法來檢查轉置的內容是否按照預期放置在組件內。 例如:如何在Angular中測試transcluded內容?
// base-button.component.ts
@Component({
selector: 'base-button',
template: `<button [type]="type">
<ng-content></ng-content>
</button>`,
})
export class BaseButtonComponent {
@Input() type = 'button';
}
基本上,在規範文件中創建一個組件實例時,我們這樣做:
// base-button.component.spec.ts
it('should reflect the `type` property into the "type" attribute of the button',() => {
const fixture = TestBed.createComponent(BaseButtonComponent);
fixture.detectChanges();
const { componentInstance, nativeElement } = fixture;
componentInstance.type = 'reset';
const button = nativeElement.querySelector('button');
expect(button.type === 'reset');
});
我們可以爲每個屬性和組件的方法,但如何做到這一點 transcluded內容?一種解決方法來創建用於測試主機組件:
// base-button.component.spec.ts
...
@Component({
template: `<base-button>Foo bar</base-button>`
})
export class BaseButtonHostComponent {}
...
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [ BaseButtonComponent, BaseButtonHostComponent ]
})
.compileComponents();
}));
it('should transclude the content correctly',() => {
const hostFixture = TestBed.createComponent(BaseButtonHostComponent);
hostFixture.detectChanges();
const button = hostFixture.nativeElement.querySelector('button');
expect(button.textContent === 'Foo bar');
});
...
但是,正如你可以想像,這是相當不方便,也因爲這已經做 與transcluded內容的每一個部件,並可能爲每<ng-content>
元素 在其模板中。有沒有另一種方法來做到這一點?