【问题标题】:Mocha test intermittent result摩卡测试间歇性结果
【发布时间】:2019-08-14 00:01:50
【问题描述】:

我正在编写一个 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,因为文件确实存在。然而,并非总是如此。但是,每次运行时都会创建该文件。

【问题讨论】:

    标签: typescript mocha.js


    【解决方案1】:

    writeFile 异步写入文件,然后调用callback。它不返回任何东西。

    所以这一行:

    await writeFile(...);
    

    ...实际上并没有等待文件被写入,因为该行确实在这样做:

    await undefined;
    

    ...不会导致编译或运行时错误,但也不会等待文件被写入。


    为确保测试始终如一地通过,您需要确保 writePackConfig 返回一个 Promise,在写入文件之前不会解析。

    Node 有一个新的 fs Promises API,当前是 Experimental,但确实有一个返回 PromisewriteFile 函数。

    另一种选择是使用util.promisify 创建一个返回PromisewriteFile 版本:

    import * as fs from 'fs';
    import * as util from 'util';
    
    const writeFile = util.promisify(fs.writeFile);  // <= This writeFile will return a Promise
    

    ...那么writePackConfig 的最后一行将是:

    await writeFile(join(destination, filename), content, { encoding: 'utf8', flag: 'wx+' });
    

    ...您的测试应该始终如一地通过。

    【讨论】:

    • 我会看看再回复你?
    • 非常感谢!这样就解决了。你又来救我了:P。只是想知道,我可以改用fs.writeFileSync 吗?
    • @RichardAnnand 是的,你可以使用fs.writeFileSync...只是不要费心把它放在async 函数中并尝试使用Promises因为它会阻塞主线程无论它在哪里被调用(正如this answer中的测试所证明的那样)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多