Angular2异步区域不等待可观察到的完成

Angular2异步区域不等待可观察到的完成,angular,rxjs,Angular,Rxjs,我对正在进行的项目的Angular2单元测试有问题 我创建了一个服务的模拟实现(我的“生产”代码): 然后我为它编写了单元测试: it('should return an object containing an approvalLink', async(inject( [PaymentService], (service: PaymentService) => { service.updatePayment()

我对正在进行的项目的Angular2单元测试有问题

我创建了一个服务的模拟实现(我的“生产”代码):

然后我为它编写了单元测试:

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()包装调用时等待所有异步操作完成。我知道我可以使用jasmine
done()
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');
                });
        }
    )));