预期的间谍导航被调用:[ [ '/members' ] ],但从未调用过



我有一个服务,它有一个执行http删除的方法。如果删除成功,那么我重定向到其他页面。当我测试这个方法时,如果我传递给它的参数id是正确的,我希望已经调用了router.navigation。但由于某种原因,这并没有发生,所以我从Jasmine那里得到了这份报告:

Jasmine规格故障测试:

Service: MemberDelete > Testing deleteMember() succesfully
Expected spy navigate to have been called with:
[ [ '/members' ] ]
but it was never called.

这是我的测试文件member-delete.service.spec.ts:

import { HttpClient, HttpResponse} from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TestBed, async, inject } from '@angular/core/testing';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { memberMockObject } from 'src/app/components/member/member.mocks';
import {createSpyFromClass, Spy} from 'jasmine-auto-spies';
import { MemberDeleteService } from './member-delete.service';
import { environment } from '../../../environments/environment';
describe('Service: MemberDelete', () => {
let service: MemberDeleteService;
let mockHttp: HttpClientTestingModule;
let mockHttpTestingController: HttpTestingController;
let router: Router;
beforeEach(() => {
TestBed.configureTestingModule({
imports:[
HttpClientTestingModule,
RouterTestingModule
],
providers:[
{ provider: MemberDeleteService, useValue: service },
{ provider: HttpClient, useValue: createSpyFromClass(HttpClient) }
]
});
mockHttp = TestBed.inject(HttpClient);
mockHttpTestingController = TestBed.inject(HttpTestingController);
service = TestBed.inject(MemberDeleteService);  
router = TestBed.inject(Router);
});
afterEach(() => {
mockHttpTestingController.verify(); //Verifies that no requests are outstanding.
});
it('should ...', () => {
expect(service).toBeTruthy();
});
it('Testing deleteMember() succesfully', () => {
spyOn(router, 'navigate');
service.deleteMember(memberMockObject.fakeMember.id);
expect(router.navigate).toHaveBeenCalledWith(['/members']);
});
});

这是我在member-delete.service.ts:中的服务方法

public deleteMember(memberId: number): void {
this._http.delete(`${this._membersUrl}/${memberId}`).subscribe({
complete: () => {
this.router.navigate(
[`/members`]
);
},
error: (error) =>  {this.handleError(error);} 
});
}

提前谢谢你,我真的很感谢你的帮助

问题是您没有为delete传递响应,而且它永远不会进入subscribe块。

请使用!!:

import { HttpClient, HttpResponse} from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { TestBed, async, inject } from '@angular/core/testing';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { memberMockObject } from 'src/app/components/member/member.mocks';
import {createSpyFromClass, Spy} from 'jasmine-auto-spies';
import { MemberDeleteService } from './member-delete.service';
import { environment } from '../../../environments/environment';
describe('Service: MemberDelete', () => {
let service: MemberDeleteService;
let mockHttp: HttpClientTestingModule;
let mockHttpTestingController: HttpTestingController;
let router: Router;
beforeEach(() => {
TestBed.configureTestingModule({
imports:[
HttpClientTestingModule,
RouterTestingModule
],
providers:[
// !! remove below line and provide actual service for testing
// { provider: MemberDeleteService, useValue: service },
MemberDeleteService,
// !! remove below line - HttpClientTestingModule mocks the HttpClient for you
// { provider: HttpClient, useValue: createSpyFromClass(HttpClient) }
]
});
mockHttp = TestBed.inject(HttpClient);
mockHttpTestingController = TestBed.inject(HttpTestingController);
service = TestBed.inject(MemberDeleteService);  
router = TestBed.inject(Router);
});
afterEach(() => {
mockHttpTestingController.verify(); //Verifies that no requests are outstanding.
});
it('should ...', () => {
expect(service).toBeTruthy();
});

// !! fakeAsync so we have better control of the subscribe
it('Testing deleteMember() succesfully', fakeAsync(() => {
spyOn(router, 'navigate');
service.deleteMember(memberMockObject.fakeMember.id);

// !! expect a http request (find the pending request)
const req = mockhttpTestingController.expectOne(request => request.url.includes(memberMockObject.fakeMember.id));
// !! expect a delete method
expect(req.request.method).toBe('Delete)';
// !! flush below response for the pending http call
req.flush({});
// !! wait for the subscribe to complete before assertion (tick does this)
tick();
expect(router.navigate).toHaveBeenCalledWith(['/members']);
}));
});

最新更新