在Angular 8中使用Jest测试库进行单元测试时,可以使用toHaveBeenCalledWith
方法来验证是否调用了指定的函数,并且传入了预期的参数。下面是一个示例,展示了如何测试API url的调用。
首先,假设我们有一个DataService
服务,它包含一个通过HTTP调用API的方法getData
:
import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
@Injectable()
export class DataService {
constructor(private http: HttpClient) {}
getData() {
const url = 'https://api.example.com/data';
return this.http.get(url);
}
}
现在,我们可以编写一个测试来验证getData
方法是否正确地调用了指定的API url:
import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { DataService } from './data.service';
describe('DataService', () => {
let service: DataService;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [DataService]
});
service = TestBed.inject(DataService);
httpMock = TestBed.inject(HttpTestingController);
});
afterEach(() => {
httpMock.verify();
});
it('should call the API with the correct URL', () => {
const mockData = { id: 1, name: 'Test' };
const url = 'https://api.example.com/data';
service.getData().subscribe((data: any) => {
expect(data).toEqual(mockData);
});
const req = httpMock.expectOne(url);
expect(req.request.method).toBe('GET');
req.flush(mockData);
});
});
在上面的示例中,我们首先导入了HttpClientTestingModule
和HttpTestingController
,它们是Angular提供的用于模拟HTTP请求的测试工具。然后,在beforeEach
函数中,我们使用TestBed.configureTestingModule
方法配置测试模块,并使用TestBed.inject
方法获取DataService
实例和HttpTestingController
实例。
在测试用例should call the API with the correct URL
中,我们首先定义了一个模拟的API响应数据mockData
和预期的API urlurl
。然后,我们调用service.getData
方法并订阅返回的Observable,在回调函数中使用expect
来验证返回的数据是否与mockData
相等。
接下来,我们使用httpMock.expectOne
方法来捕获发出的HTTP请求,并使用expect
来验证请求的URL和方法是否正确。最后,我们使用req.flush
方法来模拟API响应,并将mockData
作为响应的数据。
通过上述测试代码,我们可以验证getData
方法是否正确地调用了指定的API url,并且返回了预期的数据。