【问题标题】:Angular 2 Jasmine How to test a function of a componentAngular 2 Jasmine 如何测试组件的功能
【发布时间】:2016-12-01 16:22:56
【问题描述】:

如何在 Angular 2 中模拟函数的点击事件?对于我的 Home 组件,我有:

主页组件

import { Component } from '@angular/core';
import { Router } from '@angular/router';

@Component({
  moduleId: module.id,
  templateUrl: 'home.component.html',
  styleUrls: ['home.component.css'],
  selector: 'home',
})
export class HomeComponent {

    constructor(private router: Router) {

    }

    redirectToUpload() {
        this.router.navigate(['/upload']);
    }
    redirectToAbout() {
        this.router.navigate(['/about']);
    }

}

家庭组件规范

import { ComponentFixture, TestBed, async } from '@angular/core/testing';
import { HomeComponent } from './home.component';
import { DebugElement } from '@angular/core';
import { By } from '@angular/platform-browser';
import { Router } from '@angular/router';
import { HomeModule } from './home.module';
import { RouterLinkStubDirective, RouterOutletStubComponent } from '../../../test/router-stubs';
import { RouterModule } from '@angular/router';


export function main() {

    let de: DebugElement;
    let comp: HomeComponent;
    let fixture: ComponentFixture<HomeComponent>;
    let mockRouter:any;
    class MockRouter {
        //noinspection TypeScriptUnresolvedFunction
        navigate = jasmine.createSpy('navigate');
    }



    describe('Home component', () => {

        // preparing module for testing
        beforeEach(async(() => {
            mockRouter = new MockRouter();
            TestBed.configureTestingModule({
                imports: [HomeModule],

            }).overrideModule(HomeModule, {
                remove: {
                    imports: [ RouterModule ],

                },
                add: {
                    declarations: [ RouterLinkStubDirective, RouterOutletStubComponent ],
                    providers: [ { provide: Router, useValue: mockRouter }],
                }
            }).compileComponents().then(() => {

                fixture = TestBed.createComponent(HomeComponent);
                comp = fixture.componentInstance;


            });
        }));
            tests();
        });

        function tests() {


            beforeEach(() => {
                // trigger initial data binding
                fixture.detectChanges();



                de = fixture.debugElement.query(By.css('h1'));

            });

            it('can instantiate Home', () => {
                expect(comp).not.toBeNull();
            });


            it('should have expected <h1> text', () => {
                fixture.detectChanges();
                const h1 = de.nativeElement;
                expect(h1.innerText).toMatch("Home");
            });          


        }

}

我想测试redirectToUpload() 和redirectToAbout()。我将如何模拟点击并确保重定向是针对指定链接的?

【问题讨论】:

    标签: angular jasmine karma-jasmine angular2-routing


    【解决方案1】:

    首先,我建议您使用 Typescript 编写测试,它可以保持组件和测试之间的凝聚力。

    以下是规范文件中的基本步骤:

    获取元素(如果可能,我建议使用 Id 标签)

    const element = fixture.debugElement.query(By.css("#your-element"));
    

    触发事件。 注意:元素上必须有 (click) 事件

    element.triggerEventHandler("click", null);
    

    然后从事件中检测变化

    fixture.detectChanges();
    

    在您的 HTML 模板中,您需要将点击事件指向您希望测试的函数(click)="redirectToUpload()"

    【讨论】:

    • 我们可以把上面的步骤称为模拟点击吗?
    【解决方案2】:

    你需要得到按钮然后点击它

    de.nativeElement.querySelector('.theButtonClass').click();
    

    然后检查存根的navigate 方法是否使用正确的参数调用

    expect(mockRouter.navigate).toHaveBeenCalledWith(['/about']);
    

    您可能需要也可能不需要使用async。如果不行,可能需要使用async,等待异步点击事件稳定

    import { async } from '@angular/core/async';
    
    it('..', async(() => {
      ...click();
      fixture.whenStable().then(() => {
        expect(mockRouter.navigate).toHaveBeenCalledWith(['/about']);
      })
    })
    

    【讨论】:

      猜你喜欢
      • 2018-01-31
      • 1970-01-01
      • 2017-08-17
      • 2021-01-18
      • 2023-03-16
      • 1970-01-01
      • 2017-12-02
      • 2017-11-06
      • 2018-01-22
      相关资源
      最近更新 更多