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.

  • 相关阅读:
    updatePanel、自定义控件、弹出提示
    防止csv和excel转义
    随机码的生成
    一个页面多个Form——ajaxform
    Google首页电吉
    Sivlerlight3 向silverlight传递自定义参数
    Java接口测试get请求,使用httpClient获取cookies+携带获取的cookies访问get接口
    Java接口测试post请求,使用httpClient获取cookies+携带获取的cookies访问post接口
    Acess定义过多字段
    无依赖Office资源的导入导出
  • 原文地址:https://www.cnblogs.com/Answer1215/p/12568788.html
Copyright © 2011-2022 走看看