在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,并且返回了预期的数据。