如何使用Jest通过关于异步方法的测试



我尝试编写并运行一个关于返回Promise<Foo[]>的异步方法doSomething的测试。我使用NestJS作为后端应用程序。

根据Jest文档,这是可能的,而且似乎很容易。

我做

test('Test something', () => {
const oldFoo = getFoo(); // type Foo[]
const newFoo = getFoo();
const expect = getFoo();
return doSomething(newFoo, oldFoo).then((result) => {
const cmp: boolean = helper.equal(expect, result);
expect(cmp).toEqual(true);
});
}, 5000);

我尝试了一种更简单的方式来写

test('Test something', async () => {
const oldFoo = getFoo(); // type Foo[]
const newFoo = getFoo();
const expect = getFoo();
const result = await doSomething(newFoo, oldFoo);
expect(helper.equal(expect, result)).toEqual(true);
});
}, 5000);

我得到这个错误:

Timeout - Async callback was not invoked within the 5000 ms timeout specified by jest.setTimeout.Timeout

无论超时值是多少,我都会得到同样的错误。

我的问题是:除了测试方法真的太长之外,还有什么解释吗?因为在测试之外(在运行时(,该方法非常快。

有人能帮我找到让它发挥作用的方法吗?

如果您正在等待承诺,您可能需要异步包装测试,以便在检查结果之前完成代码。

例如,在我的端到端测试中,我会做:

it('/api (POST) test to see data returned', async done => {
const ResponseData = await request(app.getHttpServer())
.post('/api')
.set('Accept', 'application/json');
expect(ResponseData.status).toBe(200);
done();         // Call this to finish the test
});

我认为在您的测试示例中,您只是缺少了done((回调函数。

test('Test something', async done => {
const oldFoo = getFoo(); // type Foo[]
const newFoo = getFoo();
const expect = getFoo();
return doSomething(newFoo, oldFoo).then((result) => {
const cmp: boolean = helper.equal(expect, result);
expect(cmp).toEqual(true);
});
done();
}

最新更新