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

标签 javascript node.js mocha.js

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

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)
      })
  })
})

最佳答案

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

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

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

旁注:您在 isS3Healthy 函数中的两个位置有 returnresolve,但在此处使用 return几乎可以肯定没有任何作用。要解决 promise ,只需调用 resolve(...) 而不返回它。

关于javascript - 如何使用具有回调的函数来模拟对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54892171/

相关文章:

javascript - 从外部访问 JavaScript switch 语句内声明的变量

javascript - `date.setMonth`如果`date`是月末则导致月份设置过高

javascript - WebStorm 无法创建 Node.js Express 应用程序

javascript - 如果在 Bluebird 中失败,则处理成功的 HTTP promise

reactjs - 使用 webpack 插件进行 Mocha 测试

javascript - 在 javascript 中获取 asp 服务器元素时出错

javascript - 我使用 Promise.push( PromiseFunction( params ) 将 Promise 推送到 forEach 内的数组,但 PromiseFunction 会立即执行

javascript - 带有参数的 Chai 测试失败

node.js - 我的 mocha 测试单独工作,但同时运行时失败

javascript - 使用 JQuery 的子域 AJAX POST 请求的父级