Angular 带参数的角度http服务调用单元测试

Angular 带参数的角度http服务调用单元测试,angular,unit-testing,jasmine,karma-runner,Angular,Unit Testing,Jasmine,Karma Runner,我正在尝试测试此服务呼叫 我收到以下错误:错误:需要一个匹配条件“匹配URL:/api/publicdata/countries[object]”的请求,但未找到任何请求。 问题是我们正在将参数传递到调用中,我不知道如何添加它们。请您提供帮助。可能您正在等待http调用发出后,请尝试下面的测试用例 it('should return all countries', () => { const url = ({ const: environment.url + 'count

我正在尝试测试此服务呼叫

我收到以下错误:错误:需要一个匹配条件“匹配URL:/api/publicdata/countries[object]”的请求,但未找到任何请求。
问题是我们正在将参数传递到调用中,我不知道如何添加它们。请您提供帮助。

可能您正在等待http调用发出后,请尝试下面的测试用例

    it('should return all countries', () => {

    const url = ({ const: environment.url + 'countries', params: {'pagesize': '300'}});

    let countriesRequest: TestRequest = httpTestingController.expectOne(url.const + url.params);

    countriesService.getCountries().subscribe((data: Country[]) => {
            expect(data).toBe(countries);
        });

    expect(countriesRequest.request.method).toEqual('GET');

    countriesRequest.flush(countries);
})});

不确定OP是否修复了它

expectOne(url.const + url.params) // Wrong
expectOne(url.const + '?param1=value') // should be that

可能是我迟到了,但下面的解决方案对你们有用

  • 创建一个
    HttpParams
    对象并
    append()
    在其中创建所有查询参数
  • 创建
    HttpRequest
    对象并为其提供适当的值
  • 然后调用
    httpTestingController.expectOne()
    ,如下所示
  • 我使用
    urlWithParams
    来比较URL,因为它减少了检查每个URL的代码 参数对象

  • 这可能是一个输入错误,但服务方法是get(),但您在测试中并没有实际调用该特定方法,而是调用getCountries()。同样,您不能将对象插入到这样的字符串中。使用模板字符串或字符串连接来提取所需的特定属性<代码>+'?pagesize'+参数pagesize或类似文件。将其与正在运行的应用程序将url转换为的内容进行匹配。这是一个输入错误,感谢您,尽管使用带有GET参数的
    expectOne
    是一件痛苦的事情。我发现使用
    expectOne
    ()的
    matchFn
    重载更容易。它接收到
    HttpRequest
    对象,因此您可以轻松地比较基本url和参数值示例please,我看不到matchFn函数,只是Match仍然存在相同的错误。这与向服务调用中添加参数有关。我删除了参数,它可以正常工作,但由于我们的后端可以通过向调用中添加参数来进行各种过滤,我需要确保调用与预期的一样,因为您可能可以删除参数,因为您只希望http调用。您还应该模拟http调用。同时添加以下语句
    countriesRequest.result([国家/地区数组]
        it('should return all countries', () => {
    
        const url = ({ const: environment.url + 'countries', params: {'pagesize': '300'}});
    
        let countriesRequest: TestRequest = httpTestingController.expectOne(url.const + url.params);
    
        countriesService.getCountries().subscribe((data: Country[]) => {
                expect(data).toBe(countries);
            });
    
        expect(countriesRequest.request.method).toEqual('GET');
    
        countriesRequest.flush(countries);
    })});
    
    expectOne(url.const + url.params) // Wrong
    expectOne(url.const + '?param1=value') // should be that
    
     it('should return all countries', fakeAsync(() => {
    
        countriesService.getCountries().subscribe((data: Country[]) => {
                expect(data).toBe(countries);
            });
         // you can create multiple parameters by appending on same object 
        let parameters = new HttpParams().append('pagesize', '30');
         
        // environment is your base url
        const httpReq = new HttpRequest('GET',environment.url, {params:parameters}); 
    
        let countriesRequest = httpTestingController.expectOne((req:HttpRequest)=>
            req.method === httpReq.method && req.urlWithParams === httpReq.urlWithParams
        );
       
        countriesRequest.flush(countries);
        httpTestingController.verify();
    });