Javascript 如何模拟进行AJAX调用的方法?

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(

我正在尝试为Angular应用程序编写一些测试,我想模拟一个方法,这样我就不会对服务器进行实际调用

以下是我在grid.service.ts中的方法:

     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调用的方法!是的,这就是我假设的,见上文:)。我现在就去试试。