Component to be tested:
<ng-template #defaultPlaceholder> Loading... </ng-template> <div class="loading-container" *ngIf="loading$ | async"> <ng-container *ngTemplateOutlet="outlet ? outlet : defaultPlaceholder" ></ng-container> </div>
import { Component, OnInit, Input, TemplateRef, AfterViewInit } from '@angular/core' import {LoadingService} from './loading.service' import {Observable} from 'rxjs' @Component({ selector: 'loading', templateUrl: './loading.component.html', styleUrls: ['./loading.component.scss'] }) export class LoadingComponent implements OnInit, AfterViewInit { loading$: Observable<boolean> @Input() outlet: TemplateRef<any> ngAfterViewInit() {} constructor(private loadingService: LoadingService) {} ngOnInit(): void { this.loading$ = this.loadingService.loading$ } get loadingContext() { return { type: 'placeholder' } } }
Test code:
import {async, ComponentFixture, TestBed} from '@angular/core/testing'
import {LoadingComponent} from './loading.component'
import {LoadingService} from './loading.service'
import {ViewChild, Component, DebugElement} from '@angular/core'
import {of} from 'rxjs'
import {By} from '@angular/platform-browser'
@Component({
template: `
<ng-template #loadingTmp><p>loading...</p></ng-template>
<loading [outlet]="loadingTmp"></loading>
`
})
class WrapperComponent {
@ViewChild(LoadingComponent) loadingComponentRef: LoadingComponent
}
let loadingServiceSpy = {
loading$: of(true),
get config() {
return {showContent: false}
}
}
describe('LoadingComponent', () => {
let component: LoadingComponent
let wrapperComponent: WrapperComponent
let fixture: ComponentFixture<WrapperComponent>
let el: DebugElement
beforeEach(async(() => {
TestBed.configureTestingModule({
declarations: [WrapperComponent, LoadingComponent],
providers: [{provide: LoadingService, useValue: loadingServiceSpy}]
}).compileComponents()
}))
beforeEach(() => {
fixture = TestBed.createComponent(WrapperComponent)
wrapperComponent = fixture.debugElement.componentInstance
fixture.detectChanges()
component = wrapperComponent.loadingComponentRef
el = fixture.debugElement
fixture.detectChanges()
})
it('should create', () => {
expect(wrapperComponent).toBeDefined()
expect(component).toBeDefined()
})
it('should use has p tag with text loading...', () => {
const p = el.queryAll(By.css('p'))
expect(p.length).toBe(1)
expect(p[0].nativeElement.textContent).toBe('loading...')
})
})
Idea is to create a WrapperComponent to include our component. Then we are able to project content which need to be passed into the testing component.