Javascript 角度5单元测试无法读取属性';http';未定义的

Javascript 角度5单元测试无法读取属性';http';未定义的,javascript,angular,jasmine,karma-runner,Javascript,Angular,Jasmine,Karma Runner,我正试图利用HttpTestingController在角度测试中编写一个helper函数。原因是,我最终将在我的Angular服务中拥有一系列端点,RequestService,我希望在这个测试文件中测试这些端点。我不想重复地将我的RequestService和HttpTestingController实例注入到测试服务的每个测试函数中。这是多余的。相反,我更希望有一个单独的测试函数,它接受注入的RequestService和HttpTestingController实例,并将它们反复传递到我

我正试图利用
HttpTestingController
在角度测试中编写一个helper函数。原因是,我最终将在我的Angular服务中拥有一系列端点,
RequestService
,我希望在这个测试文件中测试这些端点。我不想重复地将我的
RequestService
HttpTestingController
实例注入到测试服务的每个测试函数中。这是多余的。相反,我更希望有一个单独的测试函数,它接受注入的
RequestService
HttpTestingController
实例,并将它们反复传递到我创建的助手函数
requestHelper
。这样,当我想要测试其他端点时,我所需要做的就是调用helper函数并提供所需的参数

我遇到的问题是,当helper函数运行时,由于某种原因服务的实例似乎不存在,即使测试能够访问服务的函数。当它到达我的服务方法对
callEndpoint
函数中的
http.get
的调用时,它给出以下错误:

失败:无法读取未定义的属性“http”

这对我来说没有意义,因为
This
关键字指的是Angular service的实例,并且测试用例能够访问服务的功能,那么
This
怎么可能是未定义的呢

这是我的测试规范:

import { TestBed, async, inject } from '@angular/core/testing';
import { HttpClientModule, HttpRequest, HttpParams } from '@angular/common/http';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import {  RequestService } from './request.service';

describe(`RequestService`, () => {

      beforeEach(async(() => {
        TestBed.configureTestingModule({
          imports: [
            HttpClientModule,
            HttpClientTestingModule
          ],
          providers: [
            RequestService
          ]
        });
      }));

      afterEach(async(inject([HttpTestingController], (backend: HttpTestingController) => {
        backend.verify();
      })));

      it(`TESTING INJECTION`, async(inject([RequestService, HttpTestingController],
        (service: RequestService, backend: HttpTestingController) => {

         requestHelper(service.callEndpoint,'https://endpointurl.com',backend);
      })));

      function requestHelper(serviceCall: Function, url: string,  backendInstance: any) {
        serviceCall(...serviceParams).subscribe();
        backendInstance.expectOne((req: HttpRequest<any>) => {
          return req.url === url
              && req.method === 'GET';
        }, 'GET');
      }
});
从'@angular/core/testing'导入{TestBed,async,inject};
从'@angular/common/http'导入{HttpClientModule,HttpRequest,HttpParams};
从“@angular/common/http/testing”导入{HttpClientTestingModule,HttpTestingController};
从“/request.service”导入{RequestService};
描述(`RequestService`,()=>{
beforeach(异步(()=>{
TestBed.configureTestingModule({
进口:[
HttpClientModule,
HttpClientTestingModule
],
供应商:[
请求服务
]
});
}));
每次之后(异步(注入([HttpTestingController],(后端:HttpTestingController)=>{
backend.verify();
})));
它(`TESTING INJECTION`,async(INJECTION([RequestService,HttpTestingController],
(服务:RequestService,后端:HttpTestingController)=>{
requestHelper(service.callEndpoint,'https://endpointurl.com",后端),;
})));
函数requestHelper(serviceCall:函数,url:字符串,backendInstance:任意){
serviceCall(…serviceParams.subscribe();
backendInstance.expectOne((请求:HttpRequest)=>{
return req.url==url
&&req.method=='GET';
}“得到”;
}
});
以及规范正在测试的相应服务

import { Injectable } from '@angular/core';
import { HttpClient, HttpHeaders } from '@angular/common/http';
import { RequestOptions } from '@angular/http';
import { Observable } from 'rxjs/Observable';

    @Injectable()
    export class RequestService {

      private requestOptions = {
        headers: new HttpHeaders({'Locale': 'en_US'})
      };

      constructor(private http: HttpClient) { }

      callEndpoint(state: string, countryCode: string): Observable<Object> {
        return this.http.get(`https://endpointurl.com`,this.requestOptions);
      }
}
从'@angular/core'导入{Injectable};
从'@angular/common/http'导入{HttpClient,HttpHeaders};
从'@angular/http'导入{RequestOptions};
从“rxjs/Observable”导入{Observable};
@可注射()
导出类请求服务{
私有请求选项={
标题:新的HttpHeaders({'Locale':'en_US'})
};
构造函数(私有http:HttpClient){}
callEndpoint(状态:string,国家代码:string):可观察{
返回this.http.get(`https://endpointurl.com`,这是一个选项);
}
}

谢谢你的帮助

您可以在
it
块中绑定上下文:

it(`TESTING INJECTION`, async(inject([RequestService, HttpTestingController],
    (service: RequestService, backend: HttpTestingController) => {

    requestHelper(service.callEndpoint.bind(service),'https://endpointurl.com',backend);
})));

看起来
未定义。是否尝试传递
requestHelper(service.callEndpoint.bind(service)…
?添加.bind(service)将其作为参数传递给requestHelper时,to service.callEndpoint应解决以下问题:issue@BorisLobanov这确实解决了这个问题。谢谢!你们中有人愿意把它作为一个答案发布吗?我会接受的。:)我刚刚做了,谢谢!