【问题标题】:Failed: Expected one matching request for criteria "Match URL method: GET" found none失败:预期有一个对条件“匹配 URL 方法:GET”的匹配请求,但未找到
【发布时间】:2023-03-22 00:15:02
【问题描述】:

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

我在 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)
      })
      )
  }

【问题讨论】:

    标签: angular karma-jasmine


    【解决方案1】:

    也许您的网址对于 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 中未定义,您必须设置此项。

    【讨论】:

    • 尝试了你的调试代码,但我仍然失败Error: Expected no open requests, found 1: GET https://the-url/api/details/0/0
    • 是的,所以你必须找出为什么10 变为零。希望应该相对容易。
    • 这是后端问题吗?我不认为 Jasmine 会做这些事情。我第一次遇到这个错误
    • 显示authService 类。我认为它应该是对 URL 进行 API 调用的那个。
    • 尝试使用本地存储,现在工作正常。谢谢!
    猜你喜欢
    • 2019-01-08
    • 1970-01-01
    • 2020-06-21
    • 2018-12-07
    • 2021-02-20
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多