在异步调用完成之前传递的角度测试?

时间:2017-04-21 11:36:40

标签: angular typescript jasmine

我有以下angular(4)测试应该测试服务,但是,它似乎在Observable返回之前传递并且 it('should enter the assertion', inject( [ MockBackend, CellService ], ( backend: MockBackend, s: CellService ) => { const urls = []; backend.connections.subscribe((connection: MockConnection) => { const req = connection.request; urls.push(req.url); if (req.method === RequestMethod.Get && req.url === '/api/getTest') { connection.mockRespond(new Response(new ResponseOptions('enter mocked content'))); } }); s.getCell('powders').subscribe(val => expect(true).toBeFalsy()) }) ); 得到了命中。

it('should enter the assertion', async(inject(
    [ MockBackend, CellService ],
    ( backend: MockBackend, s: CellService ) => {
        const urls = [];

        backend.connections.subscribe((connection: MockConnection) => {
            const req = connection.request;
            urls.push(req.url);
            if (req.method === RequestMethod.Get && req.url === '/api/getTest') {
                connection.mockRespond(new Response(new ResponseOptions('enter mocked content')));
            }
        });
        s.getCell('powders').subscribe(val => expect(true).toBeFalsy())
    })
));

我尝试添加async / await,但这并没有什么区别。我怎么能这样做?

更新

此代码也通过了......

{{1}}

2 个答案:

答案 0 :(得分:2)

将测试包裹在Angular的async

import { async } from '@angular/core/testing';

                         ---==== vvvv ===----
it('should enter the assertion', async(inject(
    [ MockBackend, CellService ],
    ( backend: MockBackend, s: CellService ) => {
        ...
    })
));

这将把测试包装在测试区中,这将允许Angular在完成测试之前实际等待所有异步任务完成。

另见:

更新

使用fakeAsycn / tick

进行试用
import { fakeAsync } from '@angular/core/testing';

it('should enter the assertion', fakeAsync(inject(
    [ MockBackend, CellService ],
    ( backend: MockBackend, s: CellService ) => {
        ...

        let value;
        s.getCell('powders').subscribe(val => {
          value = val;
        })
        tick();
        expect(val).toBeTruthy();
    })
));

它应该 async一起使用,但使用fakeAsync会使调试变得更容易,因为每件事都是同步的。

如果它仍然不起作用,那么您可能需要在其他地方检查逻辑。我要做的其中一项检查是

req.method === RequestMethod.Get && req.url === '/api/getTest'

你确定这两个都通过了吗?如果没有,就没有回应。

答案 1 :(得分:0)

我更喜欢在这里使用Jasmine done()回调。

首先,在规范中删除注入器并使用TestBed.get(serviceToken)部分中的beforeEach

其次,传递完成为spec函数的参数

it('should use asynchronous', done => {
  s.method().subscribe(result => {
    expect(result).toBe(...);
    done();
  }
})