【问题标题】:how to resolve async await inside a unit test - javascript如何在单元测试中解决异步等待 - javascript
【发布时间】:2018-03-01 11:40:45
【问题描述】:

我有一个 lambda,我想为其编写单元测试。我正在使用异步等待,但我遇到了解决承诺的问题。我想测试不同的条件,如何编写测试来解决并停止看到超时?

提前致谢。

错误:超过 2000 毫秒的超时。对于异步测试和钩子,确保 “完成()”被调用;如果返回 Promise,请确保它已解决。

---单位

describe('tests', function() {

    describe('describe an error', () => {
        it('should return a 500', (done) => {
            handler('', {}, (err, response) => {
                expect(err.status).to.eq('failed')
                done()
            })
        })
    })

});

-- 处理程序

export const handler = async (event, context, callback) => { 

 return callback(null, status: 500 )

})

【问题讨论】:

  • 你使用的是哪个单元测试框架?
  • handler('',{}, (err, response) => {expect(err.status).to.eq('failed')}).then(() => done() ) 真的有效吗?
  • 诗乃、柴和摩卡。我想用诗浓把测试存根,这样行吗?
  • “我正在使用异步等待” await 没有出现在问题的代码中。预期的结果是什么?

标签: javascript unit-testing lambda


【解决方案1】:

使用Blue Tape。它是对 Tape 的轻薄包装,是 Eric Elliott 等人推荐的简单、高效的测试框架。

Blue Tape 处理所有自动返回 Promise 的测试。

所有使用 async/await 的方法都根据 ECMAScript 规范返回承诺。

这是它的样子

import test from 'blue-tape';

test('`functionThatReturnsAPromise` must return a status of "failed"', async ({equals}) => {
  const {result} = await functionThatReturnsAPromise();
  equals(status, 'failed');
});

如果您只需包含 async 关键字,您甚至可以通过这种方式编写同步测试。

请注意在大多数框架中没有使用 doneend 或任何其他样板文件和与异步测试相关的噪音。

我强烈建议你试一试。

【讨论】:

    【解决方案2】:

    尝试以下操作:

    describe('tests', function() {
        describe('describe an error', () => {
            it('should return a 500', (done) => {
                await handler('', {}, (err, response) => {
                    expect(err.status).to.eq('failed');
                })
                done();
            })
        })
    });
    

    describe('tests', function() {
        describe('describe an error', () => {
            it('should return a 500', async () => {
                const error = 
                  await handler('', {}, (err, response) => Promise.resolve(err))
                expect(error.status).to.eq('failed');
            })
        })
    });
    

    无论如何,我认为,您需要 await 您的异步处理程序...

    【讨论】:

    • 嗨@dhilt,感谢您的回答。我选择了第二种方法,因为我认为它需要在某个时候解决。
    【解决方案3】:

    根据您使用的框架,有多种方法可以处理async 单元测试。

    例如,如果您使用的是Jasmine

    1) 您可以使用Spy 将您的async 回调替换为静态函数,这样它就不会是asyncronous,您可以模拟返回数据。这对于不需要测试动态异步操作的单元测试很有用(与集成测试不同)。

    2) 还有真正的异步支持文档可以在这里找到:Asynchronous Support

    3) 您应该始终使用 beforeEach()async 测试,因为这是您在描述级别定义 done() 函数的地方

    【讨论】:

    • 诗乃、柴、摩卡是我想用的。
    【解决方案4】:

    您可以增加测试的超时时间。

    describe('tests', function() {
    
        describe('describe an error', () => {
            it('should return a 500', (done) => {
                handler('', {}, (err, response) => {
                    expect(err.status).to.eq('failed')
                    done()
                })
            }).timeout(5000)
        })
    
    });
    

    timeout 方法接受以毫秒为单位的时间。默认为 2000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-17
      相关资源
      最近更新 更多