是否可以在describe中使用async + await?

时间:2019-12-28 09:31:42

标签: javascript unit-testing async-await jestjs

我正在尝试运行类似的东西

describe('REGISTRATION', async () => {
    const response = await axios.post(url, params);
});

我下面有这样的代码

describe('REGISTRATION', () => {
    // success registration, check expected fields
    test('SUCCESS', async () => {
        const response = await axios.post(url, params);

        const { status, statusText } = response;
        expect(status).toBe(200);
        expect(statusText).toBe('OK');

        const { jwt, user } = response.data;
        expect(typeof(jwt)).toBe('string');

        expect(user).toEqual({
            id: expect.any(Number),
            username: expect.any(String),
            email: expect.stringMatching(emailRegExp),
        });
    });
});

这有效,但是当出现错误时,我没有得到详细信息,这使我出错。 我会得到类似的东西

expect(received).toEqual(expected) // deep equality
expect(user).toEqual({.......

所以我想对async使用describe是因为我想做类似的事情

describe('REGISTRATION', async () => {
    const response = await axios.post(url, params);

    const { status, statusText } = response;
    const { jwt, user } = response.data;

    test('id', () => {
        expect(Number.isInteger(user.id)).toBe(true);
    });

    test('username', () => {
        expect(typeof(user.username)).toBe('string');
    });

    test('email', () => {
        expect(user.email).toEqual(expect.stringMatching(emailRegExp));
    });
});

所以我可以在测试时详细了解每个错误。

有人知道这将如何工作吗?或者我想太多,这是另一种方法吗?

2 个答案:

答案 0 :(得分:0)

尝试在“ it”上使用异步(并尝试阅读此帖子https://staxmanade.com/2015/11/testing-asyncronous-code-with-mochajs-and-es7-async-await/):

describe("REGISTRATION" , () => {
    it("Using an async method with async/await!", async function() {
            var result = await somethingAsync();
            expect(result).to.equal(something);                    
    });
});

另请参见https://mochajs.org/#asynchronous-code(有一个异步等待示例)

答案 1 :(得分:0)

因此,这里有一个有效的示例,我认为至少可以回答您有关如何查看异步调用详细信息的问题。

所以首先是jesting.js文件,这样您就可以看到即时消息仅返回Promises

const jesting = (()=>{
    function sum(a, b){
        return new Promise( (resolve)=>{
            setTimeout(()=>{
                resolve(a+b)
            },2000)
        })
    }

    function sub(a, b){
        return new Promise( (resolve,reject)=>{
            setTimeout(()=>{
                resolve(a-b)
            },2000)
        })
    }

    return {
        sum: sum,
        sub: sub
    }

})();

module.exports = jesting;

现在是jesting.test.js

const jesting = require('./jesting.js');

describe("STUFF", () => {

    const standByMe = jesting.sum(3, 3)

    test('a plus b is x', async () => {
        expect(await standByMe).toBe(6);
    })

    test('a plus b is x', async () => {
        expect(await standByMe).toBe(7);
    })

    test('a minus b is x', async () => {
        expect(await jesting.sub(7, 2).then(res => { return res - 2 })).toBe(3);
    })
})

现在会发生什么??

因此,描述将在开始时执行,standByMe将被设置为包含一个Promise,该Promise将在2秒后解析为6,而且sub()将返回一个诺言,该承诺将在2秒后解析为5但是我们想要3所以我们作弊:P

请注意,两个a + b测试await都是相同的Promise,在您的情况下,这只是一个。正如您在sub中看到的那样,您也可以在收到响应后对其进行操作。 const standByMe = jesting.sum(3, 3).then(res=>{return res+1})也是可行的,它将返回7的测试成功

结果

Results

不支持async回调中的哦和describe,因此回答您的主要问题=>否,但在测试中是

enter image description here