angular - 预期 spy 导航已使用 [ [ 'users' ] ] 调用,但从未在集成测试 Angular CLI 中调用过

标签 angular unit-testing testing angular-cli

我在一个项目上实现了一个简单的集成测试,但它失败了,因为 expect () 行在 component.save() 方法之前执行。当我将 expect() 行放在 setTimeout() 上时,它成功了。没有 setTimeout() 如何成功?

规范

 import { Observable } from 'rxjs/Rx';
 import { async, ComponentFixture, TestBed } from '@angular/core/testing';
 import { By } from '@angular/platform-browser'; 
 import { DebugElement } from '@angular/core';
 import { Router, ActivatedRoute } from '@angular/Router';
 import { UserDetailsComponent } from './user-details.component';
 import { RouterTestingModule } from '@angular/router/testing';

 class RouterStub {
 navigate(params) { };
 }
 class ActivatedRouteStub {
 params: Observable<any> = Observable.empty();
 }
 describe('UserDetailsComponent', () => {
 let component: UserDetailsComponent;
 let fixture: ComponentFixture<UserDetailsComponent>;

 beforeEach(async(() => {
  TestBed.configureTestingModule({
  imports: [RouterTestingModule],
   declarations: [UserDetailsComponent],
   providers: [
     { provide: Router, useClass: RouterStub },
     { provide: ActivatedRoute, useClass: ActivatedRouteStub }
   ],
 })
   .compileComponents();
}));

beforeEach(() => {
 fixture = TestBed.createComponent(UserDetailsComponent);
 component = fixture.componentInstance;
});

it('should redirect the user to the users page after saving', () => {
let router = TestBed.get(Router);
let spy = spyOn(router, 'navigate');

component.save();

expect(spy).toHaveBeenCalledWith(['users']);

 });
});

错误:

Expected spy navigate to have been called with [ [ 'users' ] ] but it was never called

最佳答案

我遇到了同样的问题,我通过创建 mockRouter 解决了这个问题,并检查方法 nav() 是否被调用。

在这个 HomeComponent 中是登陆组件,AppComponentrouter.navigate 方法。

在我的app.component.ts

nav() {
    this.router.navigate(['/home']);
}

还有我的app.component.spec.ts

import { TestBed, async, ComponentFixture, fakeAsync, tick,inject } from '@angular/core/testing';
import { By, BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';
import { HomeComponent } from './home/home.component';
import { RouterModule, Routes } from '@angular/router';
import { Router, RouterOutlet,ActivatedRoute } from "@angular/router";
import { RouterTestingModule } from '@angular/router/testing';
import * as br from '@angular/platform-browser';

describe('Component:AppComponent', () => {
    let component: AppComponent;
    let fixture: ComponentFixture<AppComponent>;
    let debugElement: DebugElement;
    let location, router: Router;
    let mockRouter;

    beforeEach(() => {
        mockRouter = { navigate: jasmine.createSpy('navigate') };
        TestBed.configureTestingModule({
            imports: [RouterTestingModule.withRoutes([
                { path: 'home', component: HomeComponent }
            ])],
            declarations: [AppComponent, HomeComponent],
            providers: [
                { provide: Router, useValue: mockRouter},
            ]
        });
    });

    beforeEach(() => {
        fixture = TestBed.createComponent(AppComponent);
        component = fixture.componentInstance;
        debugElement = fixture.debugElement;
    });

    it('should go home', async(() => {
        fixture.detectChanges();
        component.nav();
        expect(mockRouter.navigate).toHaveBeenCalledWith(['/home']);   
    }));
});

关于angular - 预期 spy 导航已使用 [ [ 'users' ] ] 调用,但从未在集成测试 Angular CLI 中调用过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46335028/

相关文章:

angular - 如何将图标添加到 ngx-bootstrap Accordion 组标题中?

javascript - 动态创建其他模块的组件

linux - 为 CRIU 1.8 运行单元测试时出错

unit-testing - MOQ - 如何模拟需要转换为另一个接口(interface)的接口(interface)?

ruby-on-rails - 如何在线程或子进程中运行和停止 delayed_jobs worker 以进行测试

javascript - 使用 canActivate 防护时 redirectTo 不起作用

Angular 2 - 表单组组件

python - Django 单元测试模拟

testing - 我怎么知道我是否可以成为一名优秀的软件测试员?

spring - 如何使用具有不同数据的相同测试类执行 Spring Rest Controller 测试?