承诺的拒绝不会失败测试,​​而只会打印警告

时间:2019-06-19 13:54:07

标签: javascript node.js promise chai

我正在使用chai-as-promised测试我的readIndex(path): string函数。

readIndex ()返回一个Promise,然后依次尝试打开目标文件夹中名为index.json的文件并将其解析为JSON。

请参阅以下摘录:

// readIndex.js
module.exports = path =>
  new Promise((resolve, reject) => {
    try {
      const buffer = fs.readFileSync(path + '/index.json')
      const data = JSON.parse(buffer.toString())
      resolve(data)
    } catch (err) {
      if (err.code === 'ENOENT') {
        reject(Error('file not found'))
      } else if (err instanceof SyntaxError) {
        reject(Error('format not json'))
      } else {
        reject(err)
      }
    }
  })

通过我的案例测试模拟,返回的承诺因错误而被拒绝找不到文件”。

但是实际上我正在测试(应该是)有效的情况,只有在诺言成功解决后,才应通过 ...

至少这是我对promise.should.be.fulfilled用法的了解。

查看有问题的测试:

// readIndex.test.js
chai.use(chaiAsPromised)
chai.should()

describe('SUCCESS :', () => 
  it('should resolve with a (markdown) string extrapoled from target folder index file', done => {
    const key = 'content success'
    mock(_mocks[key])
    const promise = readIndex('test')
    promise.should.be.fulfilled
    mock.restore()
    done()
  }))

使用这种设置,运行测试不会使测试失败;而是打印此消息:

    SUCCESS :
          √ should resolve with a (markdown) string extrapoled from target folder index file
    (node:183516) UnhandledPromiseRejectionWarning: AssertionError: expected promise to be fulfilled but it was rejected with 'Error: file not found'
    (node:183516) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 10)
    (node:183516) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

当然,预期的结果应该是测试运行失败,并且在控制台中是这样的:

SUCCESS :
         1) should resolve with a (markdown) string extrapoled from target folder index file:

      AssertionError: expected '1' to equal '2'

这种奇怪的行为甚至导致(有趣且不连贯的)警告。

使用promise.should.not.be.rejected,我得到了“ 期望的承诺,不被拒绝,但被拒绝了”,但测试仍然通过了:

SUCCESS :
      √ should resolve with a (markdown) string extrapoled from target folder index file
(node:225676) UnhandledPromiseRejectionWarning: AssertionError: expected promise not to be rejected but it was rejected with 'Error: file not found'

实际上我的想法是:

  • 一种解决方案可以提高测试失败的级别,以发出警告,但我没有在chai-as-promised文档中找到它。

  • 另一种解决方案是了解哪个层正在捕获错误/拒绝,并将其降低为警告。也许是chai-as-promised默认参数?

1 个答案:

答案 0 :(得分:0)

我只是在chai-as-promised documentation中遇到了这个小事实:

测试“行” (我没有更好的词)必须以 return 声明开头。

让我们看看他们的第一个示例:

return doSomethingAsync().should.eventually.equal("foo")

以下内容也很有趣:

  

,或者如果您不希望退货(例如样式   考虑因素)或不可能(例如测试框架无法实现)   允许返回承诺以表示异步测试完成),然后   您可以使用以下解决方法(其中done()由   测试框架):

doSomethingAsync().should.eventually.equal("foo").notify(done);

这对我有用。

我希望它会对人们有所帮助。