Angular2异步区域不等待可观察到的完成
我对正在进行的项目的Angular2单元测试有问题 我创建了一个服务的模拟实现(我的“生产”代码): 然后我为它编写了单元测试:Angular2异步区域不等待可观察到的完成,angular,rxjs,Angular,Rxjs,我对正在进行的项目的Angular2单元测试有问题 我创建了一个服务的模拟实现(我的“生产”代码): 然后我为它编写了单元测试: it('should return an object containing an approvalLink', async(inject( [PaymentService], (service: PaymentService) => { service.updatePayment()
it('should return an object containing an approvalLink', async(inject(
[PaymentService],
(service: PaymentService) => {
service.updatePayment()
.subscribe((data) => {
expect(data.approvalLink).toEqual('http://foo.bar/');
});
}
)));
我把它放在async zone中,因为据我所知,zone.js将在使用async()包装调用时等待所有异步操作完成。我知道我可以使用jasminedone()
或fakeAsync
区域和tick()
,但我想了解async()
的要点
到目前为止,很好,这起作用了。问题是,将我的生产代码更改为以下代码后,它仍然有效:
updatePayment(orderId?: String) {
if (!orderId) {
orderId = null;
}
return this.http.post('/updatePayment', {
'orderId': orderId || ''
})
.map((data: any) => {
return {
approvalLink: data.json().approvalLink
}
});
}
我已经向我的测试床提供者添加了一个MockBackend
,但是我还没有模拟响应(所以还没有MockBackend.connections.subscribe…
)
但它仍然有效。仔细看一看,subscribe()块根本没有执行(我猜是因为可观察对象从不发出值)。但这不是async()
的意义吗?我所期望的是,这会进入一个超时,因为什么都没有发生。或者,单元测试永远不会结束。即使抛出一个Expection对我来说也是可以的,但是为什么它只是通过了测试而没有执行逻辑呢?尽管我明确地说,我现在正在做异步的事情
这将起作用并执行subscribe()回调:
fit('should get a approvalLink back', async(inject(
[MockBackend, PaymentService],
(mockBackend: MockBackend, service: PaymentService) => {
mockBackend.connections.subscribe(connection => {
let response;
response = new Response(new ResponseOptions({
body: JSON.stringify({
approvalLink: 'http://foo.bar'
})
}));
connection.mockRespond(response);
});
service.updatePayment()
.subscribe((data) => {
expect(data.approvalLink).toEqual('http://foo.bar');
});
}
)));
再一次-我知道如何解决这个问题,但也许有人能给我一些见解,帮助我理解异步区域是关于什么的
提前感谢,,
大卫
fit('should get a approvalLink back', async(inject(
[MockBackend, PaymentService],
(mockBackend: MockBackend, service: PaymentService) => {
mockBackend.connections.subscribe(connection => {
let response;
response = new Response(new ResponseOptions({
body: JSON.stringify({
approvalLink: 'http://foo.bar'
})
}));
connection.mockRespond(response);
});
service.updatePayment()
.subscribe((data) => {
expect(data.approvalLink).toEqual('http://foo.bar');
});
}
)));