代码之家  ›  专栏  ›  技术社区  ›  Catfish

如何用具有回调的函数模拟对象?

  •  0
  • Catfish  · 技术社区  · 6 年前

    我有一个简单的方法,我正在尝试测试。

    function isS3Healthy(s3, logger = console) {
      return new Promise((resolve, reject) => {
        s3.listObjects({}, (err, data) => {
          if (err) {
            logger.error(err)
            return resolve(['s3', false])
          }
          return resolve(['s3', true])
        })
      })
    }
    

    我的测试一直超时,这与我的模拟对象不正确有关。为了正确地测试我的方法,这个模拟对象需要看起来像什么?

    describe.only('#isS3Healthy', () => {
      let s3
      before(() => {
        s3 = {
          listObjects: ({}, (err, data) => {
            return Promise.resolve(['s3', true])
          })
        }
      })
    
      it('should return that it is healthy', () => {
        return isS3Healthy(s3)
          .then(result => {
            const [name, status] = result
            expect(name).to.equal('s3')
            expect(status).to.be.true
          })
          .catch(err => {
            console.log('err = ', err)
          })
      })
    })
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   JLRishe    6 年前

    根据你提供的代码 listObjects 是一个函数,它接受一个对象和一个回调,并在某个时刻调用该回调,因此模拟它的最简单方法可能如下所示:

    listObjects: (_, c) => c()
    

    您正在测试的函数似乎只关心 列表对象

    旁注: 你有 return resolve 在你家的两个地方 isS3Healthy 函数,但使用 return resolve(...) 没有归还。

    推荐文章