Javascript 如何模拟进行AJAX调用的方法?
我正在尝试为Angular应用程序编写一些测试,我想模拟一个方法,这样我就不会对服务器进行实际调用 以下是我在grid.service.ts中的方法:Javascript 如何模拟进行AJAX调用的方法?,javascript,ajax,angular,unit-testing,karma-jasmine,Javascript,Ajax,Angular,Unit Testing,Karma Jasmine,我正在尝试为Angular应用程序编写一些测试,我想模拟一个方法,这样我就不会对服务器进行实际调用 以下是我在grid.service.ts中的方法: loadAccountListPromise(id: string) { let promise = new Promise((resolve, reject) => { this.http.get(`${this.baseUrl}`) .toPromise(
loadAccountListPromise(id: string) {
let promise = new Promise((resolve, reject) => {
this.http.get(`${this.baseUrl}`)
.toPromise()
.then(
(data) => {
this.results = this.formatData(data.json());
resolve(this.results);
},
(msg) => {
reject(msg);
}
);
});
return promise;
}
到目前为止,我已经试着按照官方的角度测试指南写了这样的东西。在我的grid.service.spec.ts中,我有:
it('loadAcountListPromise should return Promise', () => {
let someHttp;
spyOn(myInnergridService, 'loadAccountListPromise').and.callThrough();
myInnergridService.loadAccountListPromise(someHttp).then(
( response ) => { expect( response ).toBe( jasmine.any(Promise) );
});
});
在这里,我监视该方法,但通过调用.callthrough()
我使用的是实际的实现,从而对服务器进行真正的AJAX调用。我希望避免这种情况,并出于测试目的伪造GET请求。如何做到这一点?首先,测试台:
beforeach(()=>{
TestBed.configureTestingModule({
导入:[HttpModule],
供应商:[
你的服务,
//…其他服务
{provide:XHRBackend,useClass:MockBackend}
]
});
});
然后,在每次测试中(或在每次测试之前):
it('testinghttp调用…',inject([YourService,XHRBackend],(service:YourService,http:MockBackend)=>{
让cnt:模拟连接;
让response={contenu:'这里有你想要的任何东西'};
http.connections.subscribe((连接:MockConnection)=>{
cnt=连接;
//响应(选择一个)
连接。mockresponse(新响应)(新响应选项({
正文:JSON.stringify(响应)
})));
//错误(选择一个)
mockError(新错误('Error'));
});
让goodCall=(方法,url)=>{
expect(cnt.request.method).toBe(method);
expect(cnt.request.url.endsWith(url)).toBe(true);
};
订阅(res=>goodCall(RequestMethod.Get,'params/search');
}));
如果你不明白,尽管问吧 哦,对于关键字的导入:
import{HttpModule,Http,Response,ResponseOptions,RequestOptions,Headers,XHRBackend,RequestMethod}来自“@angular/Http”代码>第二次导入(很抱歉,我单独做了一些注释以使其更清楚):从'@angular/http/testing'导入{MockBackend,MockConnection}代码>谢谢,但这一次有点太多了…当您调用方法时
这是我的loadAccountListPromise()
方法,正确。什么是(RequestMethod.Get,'params/search')
?RequestMethod
也是我的方法吗?另外,如何测试值类型?我想我上面的规范已经不适用了:(method()
是进行您想要测试的http调用的方法。MyService
是……您的服务,您可能会猜到:D如果您看一下,最后一部分,我在调用该方法之前创建了一个函数,名为GoodCall
:它需要一个http方法(GET,PUT…)和一个端点作为参数,并查看该方法是否使用正确的方法调用正确的端点。这里,我测试method
是否正在生成http.get
(RequestMethod.get
),在端点上,以params/search
结尾。这样更容易,因为您可以在同一测试中调用正在进行http调用的方法!是的,这就是我假设的,见上文:)。我现在就去试试。