Spec 对 Angular 7 没有期望

Ha *_*dan 5 unit-testing jasmine karma-jasmine angular

我正在使用 Jasmine 和 Karma 进行单元测试 Angular 应用程序。我写了这样的单元测试:

describe('#getAll', async () => {
    it('#should return user intergration_tester', inject([UsersService], async(service: UsersService) => {
        await service.getAll('integration_tester', access_token).subscribe(
            user => {
                expect(user[0].firstName).toContain('Integration');
                done();
            })
      }));

      it('#should return error 404', inject([UsersService], (service: UsersService) => {
        service.getAll('integration_tester', '').subscribe(
            user => {expect(user[0].firstName).not.toContain('Integration');},
            err => { expect(err).toContain('error');}
        )
      }));
})
Run Code Online (Sandbox Code Playgroud)

当我执行测试用例时,我看到一条消息“规范对这两个测试用例都没有期望”。我想知道为什么它显示规范没有期望。

然后我按照这篇文章中建议的解决方案进行操作:Spec没有期望 - Jasmine测试回调函数

使用done()

describe('#getAll', async () => {
    it('#should return user intergration_tester', inject([UsersService], async(service: UsersService, done) => {
        await service.getAll('integration_tester', access_token).subscribe(
            user => {
                expect(user[0].firstName).toContain('Integration');
                done();
            })
      }));

      it('#should return error 404', inject([UsersService], (service: UsersService, done) => {
        service.getAll('integration_tester', '').subscribe(
            user => {expect(user[0].firstName).not.toContain('Integration'); done();},
            err => { expect(err).toContain('error'); done();}
        )
      }));
})
Run Code Online (Sandbox Code Playgroud)

茉莉花再次告诉我,spec has no expectations

And*_*tar 3

等待订阅没有任何作用...

await service.getAll(...).subscribe(...)

您需要将 observable 转换为 Promise。另外,请确保您的 observable 完成,否则您只需要获取第一个元素,否则承诺将永远不会解析(假设 getAll 继续发送事件或其他内容 - 但您应该在测试运行期间超时)。这应该可以解决问题:

describe('#getAll', async () => {
    it('#should return user intergration_tester', inject([UsersService], async (service: UsersService) => {
        const user = await service.getAll('integration_tester', access_token).toPromise();
        expect(user[0].firstName).toContain('Integration');
    }));

    it('#should return error 404', inject([UsersService], async (service: UsersService) => {
        try {
            const user = await service.getAll('integration_tester', '').toPromise();

            expect(user[0].firstName).not.toContain('Integration');
        } catch (err) {
            // why do you also expect an error to be thrown?
            expect(err).toContain('error');
        }
    }));
})
Run Code Online (Sandbox Code Playgroud)