失败:预期找到一个条件 "Match URL method: GET" 的匹配请求 none

Failed: Expected one matching request for criteria "Match URL method: GET" found none

您好,我正在尝试在我的 jasmine 单元测试中对 API 进行模拟 GET 调用,它返回给我 url 未找到错误。

我在 service.spec 文件中这样做了:

it('GET call for store details API', waitForAsync(inject([HttpTestingController, AuthService],
        (httpClient: HttpTestingController, authService: AuthService) => {

            var obj = {
                "IsSuccess": true,
                "Result": [
                    {
                        "Details": "Test"
                    }
                ]
            }

            authService.getStoreDetails()
                .subscribe((get: any) => {
                    expect(get).toBe(obj);
                });

            const successRequest = httpTestingController.expectOne(environment.baseUrl1 + '/api/details/10/0');
            expect(successRequest.request.method).toEqual('GET');
            successRequest.flush(obj);
            httpTestingController.verify();
        })));

当我在没有多个端点 ex; api/user 的其他 GET 调用中做同样的事情时,测试工作正常。这个以及使用某些参数的 GET 的解决方案是什么?

编辑:-

添加service.ts

createId() {
    const ids = localStorage.getItem('ids');
    return ids
}

// GET API for Store Details
  getStoreDetails(): Observable<any> {
    let headers = this.createAuthrorizationHeader();
    let idd = this.createId();
    var id = Number(JSON.parse(idd!));
    return this.http
      .get(`${environment.baseUrl1}/api/details/${id}/0`, { headers: 
      headers })
      .pipe(tap(res => {
        console.log(res);
        retry(2),
          catchError(this.handleError)
      })
      )
  }

也许您的 URL 对 expectOne 是错误的,或者它可能不是 GET 请求。

要调试,试试这个:

it('GET call for store details API', waitForAsync(inject([HttpTestingController, AuthService],
        (httpClient: HttpTestingController, authService: AuthService) => {

            var obj = {
                "IsSuccess": true,
                "Result": [
                    {
                        "Details": "Test"
                    }
                ]
            }
            // Edit - add this line
            localStorage.setItem('ids', '10')

            authService.getStoreDetails()
                .subscribe((get: any) => {
                    // expect(get).toBe(obj);
                    expect(1).toBe(1);
                });

            // const successRequest = httpTestingController.expectOne(environment.baseUrl1 + '/api/details/10/0');
            // expect(successRequest.request.method).toEqual('GET');
            // successRequest.flush(obj);
            // log out the URL you expect
            console.log('url: ', environment.baseUrl1 + '/api/details/10/0');
            httpTestingController.verify();
        })));

    afterEach(() => {
      // clear local storage so it does not leak for other tests
      localStorage.clear();
    });

httpTestingController.verify() 应该检测是否有任何正在进行的 HTTP 调用尚未处理(未刷新)。

如果有,它会告诉你 URL 没有被刷新,你应该使用这个 URL 作为 expectOne

如果没有,则问题更大,authService.getStoreDetails() 没有进行 API 调用。

这应该可以帮助您进行调试。

编辑:我看到了问题,很可能 ids 在 localStorage 中未定义,您必须设置此项。