web-dev-qa-db-ja.com

Angular 5 Jasmine Error:条件に一致するリクエストが1つあると予想されるものは見つかりませんでした

私は非常に簡単なサービスコールとジャスミンテストを行っています。

サービスコール:

myServiceCall(testId: number) : void {
    const url = `${this.url}/paramX/${testId}`;
    this.http.put(url, {},{headers: this.headers}).subscribe();
}

私のテスト方法:

it('should call myServiceCall', inject([MyService], (service: MyService) => {
    let testId = undefined;
    service.myServiceCall(testId);
    let req = httpMock.expectOne(environment.baseUrl + "/paramX/123");

    expect(req.request.url).toBe(environment.baseUrl + "/paramX/123");
    expect(req.request.body).toEqual({});

    req.flush({});
    httpMock.verify();
}));

Urlパラメーターが「123」であり、このテストケースのシナリオのように未定義ではないことを期待しているため、もちろん例外が発生します。

エラー:基準「一致URL: http:// localhost:8080/myservice/paramX/12 」に対する一致する要求が1つ必要で、見つかりません。

私が理解していないのは、テストフレームワークが言う理由です

見つかりませんでした

要求が行われますが。 mockitoの検証と同様に、テストフレームワークが他の実際の呼び出しが行われたを教えてくれる可能性はありますか?

6
mrkernelpanic

私の問題は解決しました。 URLに追加した後、params(paramsを使用する場合)。

_let results = { param: 'results', value: '50' }; url = `${api.url}${route.url}?${results.param}=${results.value}`;_

HttpTestingControllerは常にparamsなしのurlのみを表示しますが、expectOne(url)を使用すると、次のようなクエリ文字列を持つurlを使用します:_http://example.com/path/to/page?name=ferret&color=purple_

あなたは間違ったエラーを読んだので、あなたのために言い換えさせてください:

エラー:一致する要求[...]が1つ必要ですが、見つかりませんでした。

これは単にURLが一致しないことを意味します。

あなたができることは、あなたのURLのコンソールログを追加することです

console.log(req.request.url);

または、単にリクエストを一致させることもできます。

その他の解決策:環境変数に依存しているため、代わりにこのテストを実行できます:

expect(req.request.url.endsWith("/paramX/123")).toEqual(true);
10
user4676340

FakeAsync内でテストを行い、テストの最後にtick()を呼び出す必要があります。のような

it('should call myServiceCall', inject([MyService], fakeAsync((service: MyService) => {
    let testId = undefined;
    service.myServiceCall(testId);
    let req = httpMock.expectOne(environment.baseUrl + "/paramX/123");

    expect(req.request.url).toBe(environment.baseUrl + "/paramX/123");
    expect(req.request.body).toEqual({});

    req.flush({});
    httpMock.verify();
    tick();

})));
1
saidutt