修正方法がわからない失敗したテストがあります。Jest から得たエラー メッセージは矛盾しているように見えます。問題は 2 つのAngular HttpTestingControllerメソッドの動作に関連しています:verify()
とexpectOne()
.
そのファイルのコンテキストでの、問題のテスト:
import {TestBed, getTestBed} from '@angular/core/testing';
import {HttpClientTestingModule, HttpTestingController} from '@angular/common/http/testing';
import {PrintProjectsService} from './print-projects.service';
import {AppConfig} from '../../app.config';
describe('PrintProjectsService', () => {
let injector: TestBed;
let service: PrintProjectsService;
let appConfig: AppConfig;
let httpMock: HttpTestingController;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpClientTestingModule],
providers: [PrintProjectsService, AppConfig]
});
injector = getTestBed();
service = injector.get(PrintProjectsService);
httpMock = injector.get(HttpTestingController);
appConfig = injector.get(AppConfig);
});
afterEach(() => {
httpMock.verify();
});
//This test passes
it('should make a GET request to retrieve a printable factory when provided a printable factory id', () => {
const id = '12345';
service.getPrintableFactory(id).subscribe();
const req = httpMock.expectOne(`${appConfig.API_URL}/api/printed-book/v1/printable-factories/${id}/`);
expect(req.request.method).toBe('GET');
});
// This is the one that fails
it('should make a GET request to retrieve cover image data from the cover service', () => {
const imageType = 'full';
service.getCoverImage(12345, '0850X1100FCSTDCO080CW444GXX', imageType).subscribe();
//httpMock.verify(); //this finds a GET at undefined/cover/api/cover-images/full
const req = httpMock.expectOne(`${appConfig.API_URL}/cover/api/cover-images/${imageType}`);
expect(req.request.responseType).toBe('blob');
});
});
Jest は次のエラー メッセージを返します。
● PrintProjectsService › should make a GET request to retrieve cover image data from the cover service
Expected one matching request for criteria "Match URL: undefined/cover/api/cover-images/full", found none.
44 | service.getCoverImage(12345, '0850X1100FCSTDCO080CW444GXX', imageType).subscribe();
> 45 | const req = httpMock.expectOne(`${appConfig.API_URL}/cover/api/cover-images/${imageType}`);
46 | expect(req.request.responseType).toBe('blob');
at HttpClientTestingBackend.Object.<anonymous>.HttpClientTestingBackend.expectOne (node_modules/@angular/common/bundles/common-http-testing.umd.js:435:19)
at src/app/services/print-projects/print-projects.service.spec.ts:45:26
...
at Object.testBody.length (node_modules/jest-zone-patch/index.js:50:27)
● PrintProjectsService › should make a GET request to retrieve cover image data from the cover service
Expected no open requests, found 1: GET undefined/cover/api/cover-images/full
23 | afterEach(() => {
> 24 | httpMock.verify();
25 | });
URL 変数がエラー メッセージにレンダリングされるという事実undefined
は無関係です。これは、合格したテスト内でも同様です。
私を混乱させているのはexpectOne()
、テスト内で に到達すると、 に対するリクエストが見つからずundefined/cover/api/cover-images/full
、テスト後に同じURL:verify()
で GET リクエストが見つかることです。の前の行のテスト内に置かれたときに、GET 要求も検出します。undefined/cover/api/cover-images/full
verify()
undefined/cover/api/cover-images/full
expectOne()
expectOne()
リクエストをキャッチしないのはなぜverify()
ですか? エラー メッセージには、必要な情報がすべて記載されていませんか? 実行しても実行しても、同じエラー メッセージが表示されるようjest
ですjest --verbose
。