摩卡测试间歇结果

时间:2019-03-22 23:39:44

标签: typescript mocha

我正在编写摩卡测试,以检查函数运行后该文件是否存在。我目前得到的结果是断断续续的。它有时会连续经过几次,但随后会失败。我是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。但是,并非一直如此。但是,该文件在每次运行时都会创建。

1 个答案:

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

...并且您的测试应始终通过。