zoukankan      html  css  js  c++  java
  • [Angular Unit Testing] Testing component with content projection

    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.

  • 相关阅读:
    哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(低年级)
    ACM_X章求和(数学)
    goj 扫雷(dfs)
    Sereja and Brackets(括号匹配)
    NOIP模拟赛 迷路
    NOIP模拟赛three(3)
    NOIP模拟赛2(two)
    NOIP模拟赛1(one)
    czy的后宫5
    [BZOJ3436]小K的农场
  • 原文地址:https://www.cnblogs.com/Answer1215/p/12568788.html
Copyright © 2011-2022 走看看