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这确实解决了这个问题。谢谢!你们中有人愿意把它作为一个答案发布吗?我会接受的。:)我刚刚做了,谢谢!