我正在编写摩卡测试,以检查函数运行后该文件是否存在。我目前得到的结果是断断续续的。它有时会连续经过几次,但随后会失败。我是TypeScript的新手,所以不确定发生了什么。
我检查了我的代码,并确保正确回答了诺言。
这是我要测试的功能:
export async function writePackConfig (templateFile: TemplateFile, destination: string, filename: string) {
LogToConsole('Writing pack config file')
const mappings = await getPackInfo()
let content = generateTemplate(TemplateFile.packFile, mappings)
// writeFileContent(join(destination, filename), content, filename, false)
await writeFile(join(destination, filename), content, { encoding: 'utf8', flag: 'wx+' }, (error) => {
if (error) {
throw error
}
return Promise.resolve()
})
}
这就是我对其进行测试的方式:
describe('Testing writePackConfig function', function () {
let testFolder = join(__dirname, 'writePackConfig-test')
before('Create testing folder', async () => {
try {
removeSync(testFolder)
} catch {
console.log('Folder does not exist')
}
mkdirSync(testFolder)
return Promise.resolve()
})
before('Create pack.yaml file', async () => {
let mappings = {
'ref': 'pack-ref',
'packname': 'Pack Ref',
'author': 'Test Author',
'email': 'example@example.com'
}
let stubGetPackInfo = sinon.stub(bootstrapfunctions, 'getPackInfo').resolves(mappings)
await writePackConfig(TemplateFile.packFile, testFolder, 'write-pack-config-pack.yaml').catch(error => {
console.log(error)
})
stubGetPackInfo.restore()
return Promise.resolve()
})
it('Check that file is written when writePackConfig is run', function () {
let result = existsSync(join(testFolder, 'write-pack-config-pack.yaml'))
console.log(result)
assert.strictEqual(result, true)
})
由于文件确实存在,它应该返回true。但是,并非一直如此。但是,该文件在每次运行时都会创建。
答案 0 :(得分:0)
writeFile
异步写入文件,然后调用callback
。它什么也不会返回。
所以这行:
await writeFile(...);
...实际上并不等待文件写入,因为该行实际上是在这样做:
await undefined;
...这不会导致编译或运行时错误,但也不会等待文件被写入。
要确保测试一致通过,您将需要确保writePackConfig
返回Promise
,直到写入文件后该解析才解决。
节点有一个新的fs Promises API,当前是Experimental
,但确实有一个返回Promise
的{{3}}函数。
另一种选择是使用writeFile
创建一个返回writeFile
的{{1}}版本:
Promise
...然后import * as fs from 'fs';
import * as util from 'util';
const writeFile = util.promisify(fs.writeFile); // <= This writeFile will return a Promise
的最后一行就是:
writePackConfig
...并且您的测试应始终通过。