Angular 2 RC-5 异步测试不工作
Angular 2 RC-5 Async testing is not working
那是代码:
import {
async,
inject,
TestBed
} from '@angular/core/testing';
import {
Http,
Response,
ResponseOptions,
RequestOptions,
BaseRequestOptions,
ConnectionBackend
} from "@angular/http";
import {MockBackend, MockConnection} from "@angular/http/testing";
import {HttpInterceptor, RequestWrapped} from "./http.interceptor.service.ts";
describe("Http interceptor", () => {
beforeEach(() =>{
TestBed.configureTestingModule({
providers: [
MockBackend,
BaseRequestOptions,
{provide: ConnectionBackend, useClass: MockBackend},
{provide: RequestOptions, useClass: BaseRequestOptions},
Http
],
});
});
it('should get blogs', inject([Http, MockBackend], (http:Http, backend:MockBackend) => {
let connection:MockConnection;
backend.connections.subscribe(connection =>
connection.mockRespond(new Response(new ResponseOptions('awesome')))
);
http.request('data.json').subscribe((res) => {
expect(res.text()).toBe('awesome2');
});
}));
});
这个测试应该会失败,很明显 awesome 不等于 awesome2,为什么不起作用?
因为it
方法在异步回调之前执行完毕。在 vanilla Jasmine 中,您将使用 done
处理异步
it('', function (done) {
setTimeout(function () {
expect(2).toBe(2);
done();
}, 1000);
});
done
是 Jasmine 知道我们已完成所有异步事件并且测试已完成的方式。
使用 Angular,而不是显式调用 done
,我们应该在 async
中调用 fundtion。这会将整个方法包装在一个区域中,并在其中跟踪所有异步调用。当所有异步调用都完成后,测试就完成了。这不同于 同步 测试,后者一旦方法完成,测试就完成了
import { async } from '@angular/core/testing';
// async wapper
it('should get blogs', async(inject([Http, MockBackend], (http:Http, backend:MockBackend) => {
let connection:MockConnection;
backend.connections.subscribe(connection =>
connection.mockRespond(new Response(new ResponseOptions('awesome')))
);
http.request('data.json').subscribe((res) => {
expect(res.text()).toBe('awesome2');
});
})));
还有fakeAsync
,可以让你控制"ticks"
it('should get blogs', fakeAsync(inject([Http, MockBackend], (http:Http, backend:MockBackend) => {
let connection:MockConnection;
backend.connections.subscribe(connection =>
connection.mockRespond(new Response(new ResponseOptions('awesome')))
);
let text;
http.request('data.json').subscribe((res) => {
text = res.text();
});
tick();
expect(res.text()).toBe('awesome2');
})));
那是代码:
import {
async,
inject,
TestBed
} from '@angular/core/testing';
import {
Http,
Response,
ResponseOptions,
RequestOptions,
BaseRequestOptions,
ConnectionBackend
} from "@angular/http";
import {MockBackend, MockConnection} from "@angular/http/testing";
import {HttpInterceptor, RequestWrapped} from "./http.interceptor.service.ts";
describe("Http interceptor", () => {
beforeEach(() =>{
TestBed.configureTestingModule({
providers: [
MockBackend,
BaseRequestOptions,
{provide: ConnectionBackend, useClass: MockBackend},
{provide: RequestOptions, useClass: BaseRequestOptions},
Http
],
});
});
it('should get blogs', inject([Http, MockBackend], (http:Http, backend:MockBackend) => {
let connection:MockConnection;
backend.connections.subscribe(connection =>
connection.mockRespond(new Response(new ResponseOptions('awesome')))
);
http.request('data.json').subscribe((res) => {
expect(res.text()).toBe('awesome2');
});
}));
});
这个测试应该会失败,很明显 awesome 不等于 awesome2,为什么不起作用?
因为it
方法在异步回调之前执行完毕。在 vanilla Jasmine 中,您将使用 done
it('', function (done) {
setTimeout(function () {
expect(2).toBe(2);
done();
}, 1000);
});
done
是 Jasmine 知道我们已完成所有异步事件并且测试已完成的方式。
使用 Angular,而不是显式调用 done
,我们应该在 async
中调用 fundtion。这会将整个方法包装在一个区域中,并在其中跟踪所有异步调用。当所有异步调用都完成后,测试就完成了。这不同于 同步 测试,后者一旦方法完成,测试就完成了
import { async } from '@angular/core/testing';
// async wapper
it('should get blogs', async(inject([Http, MockBackend], (http:Http, backend:MockBackend) => {
let connection:MockConnection;
backend.connections.subscribe(connection =>
connection.mockRespond(new Response(new ResponseOptions('awesome')))
);
http.request('data.json').subscribe((res) => {
expect(res.text()).toBe('awesome2');
});
})));
还有fakeAsync
,可以让你控制"ticks"
it('should get blogs', fakeAsync(inject([Http, MockBackend], (http:Http, backend:MockBackend) => {
let connection:MockConnection;
backend.connections.subscribe(connection =>
connection.mockRespond(new Response(new ResponseOptions('awesome')))
);
let text;
http.request('data.json').subscribe((res) => {
text = res.text();
});
tick();
expect(res.text()).toBe('awesome2');
})));