Angular 异步调用完成之前是否通过角度测试?

Angular 异步调用完成之前是否通过角度测试?,angular,typescript,jasmine,Angular,Typescript,Jasmine,我有下面的角度(4)测试,它应该测试一个服务,然而,它似乎在可观察的返回和expectget的命中之前通过了 it('should enter the assertion', inject( [ MockBackend, CellService ], ( backend: MockBackend, s: CellService ) => { const urls = []; backend.connec

我有下面的角度(4)测试,它应该测试一个服务,然而,它似乎在可观察的返回和
expect
get的命中之前通过了

   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())
        })
    );
我试着添加async/await,但没有什么不同。我该怎么做

更新:

这个密码也通过了

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())
    })
));

用Angular的
async

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

                         ---==== vvvv ===----
it('should enter the assertion', async(inject(
    [ MockBackend, CellService ],
    ( backend: MockBackend, s: CellService ) => {
        ...
    })
));
这将把测试包装在一个测试区域中,这将允许Angular在完成测试之前实际等待所有异步任务完成

另请参见:

更新 用fakeAsycn试试看/
勾选

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'

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

我更愿意在这里使用Jasmine
done()
回调

首先,去除规范中的喷油器,并在每个部分之前使用
TestBed.get(serviceToken)
中的

第二,作为spec函数的参数传递done

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

查看我的更新问题,我尝试了这种方法,但仍然没有看到预期的行为,我是否做错了什么?查看我的更新。确保条件通过。如果没有,将没有回应。