1

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

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 虚拟机,所以这就是我倾向于 mac/linux 问题的原因,但我不能确定。更进一步,大约五分之一的它通过我们的 CI 服务器,所以它可能是某种竞争条件?

4

1 回答 1

2

来自 AVA 文档:

您必须同步定义所有测试。它们不能在 , 等内部setTimeout定义setImmediate

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

于 2017-02-02T05:59:12.647 回答