我正在使用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
默认参数?
答案 0 :(得分:0)
我只是在chai-as-promised
documentation中遇到了这个小事实:
测试“行” (我没有更好的词)必须以 return
声明开头。
让我们看看他们的第一个示例:
return doSomethingAsync().should.eventually.equal("foo")
以下内容也很有趣:
,或者如果您不希望退货(例如样式 考虑因素)或不可能(例如测试框架无法实现) 允许返回承诺以表示异步测试完成),然后 您可以使用以下解决方法(其中done()由 测试框架):
doSomethingAsync().should.eventually.equal("foo").notify(done);
这对我有用。
我希望它会对人们有所帮助。