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

时间:2019-02-26 18:46:04

标签: javascript node.js mocha

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

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 个答案:

答案 0 :(得分:1)

根据您提供的代码,看起来listObjects是一个接受对象和回调的函数,有时会调用该回调,因此模拟它的最简单方法可能是这个:

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

您正在测试的函数似乎只关心listObjects是否将错误传递给回调,因此这似乎就足够了。

旁注:您在return resolve函数中有两个地方isS3Healthy,但是在这里使用return几乎毫无用处。要解决承诺,只需调用resolve(...)而不返回它即可。