AVA测试在一个在mac上运行的函数中调用,但不在linux

时间:2017-02-01 16:45:21

标签: ava

我有一些AVA测试,我试图多次运行,但在不同的模拟。例如,我想运行相同的5个测试,但要确保这些测试适用于各种结构化数据。我已经设计了一种将mocks导入测试文件的方法,并将它们与它们应该解析的方式进行比较,看起来类似于以下内容:

import test from 'ava';
import * as fs from 'fs';

let mockSampleEmail;
let mockDecomposedEmail;

function readJsonFile(fname) {
  return JSON.parse(fs.readFileSync(fname).toString());
}

fs.readdir('pre', (err, files) => {
  files.forEach(file => {
    if (!file.match(/\.json$/)) {
      return null;
    }
    mockSampleEmail     = readJsonFile("pre/" + file);
    mockDecomposedEmail = readJsonFile("post/" + file);
    runEmailDecomposerTests(mockSampleEmail, mockDecomposedEmail, mockRiskyUpdates, file);
  })
})

runEmailDecomposerTests函数如下所示:

const runEmailDecomposerTests = (mockSampleEmail, mockDecomposedEmail, mockRiskyUpdates, fname) => {
  test(`(${fname})  Converts the email message received from the websocket into a simple email object`, t => {
    //Assertions here
  })
}

我的目录结构如下所示:

test/
--emails/
----emailDecomposer.spec.js
----pre/
------sampleEmail.json
----post/
------sampleEmail.json

这一切都在我的Mac上本地工作,但是当我将它推送到我们的jenkins服务器以测试持续集成时,它会因错误而失败:

 ✖ No tests found in test/emails/emailDecomposer.spec.js

即使我可以确认runEmailDecomposerTests函数肯定是被调用的。令人困惑的部分是它在我的mac上本地传递。 jenkins服务器是Linux vm,这就是我倾向于mac / linux问题的原因,但我无法确定。更进一步,它在我们的CI服务器上传递了大约五分之一,所以它可能是某种竞争条件?

1 个答案:

答案 0 :(得分:2)

来自AVA文档:

  

您必须同步定义所有测试。无法在setTimeoutsetImmediate等内定义它们。

fs.readdir是异步的,所以我很惊讶它实际上适用于macOS,但正如你所经历的那样,它会导致种族问题。我建议切换到fs.readdirSync或在test.before()挂钩中执行异步操作,然后利用t.context