我有一些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服务器上传递了大约五分之一,所以它可能是某种竞争条件?
答案 0 :(得分:2)
来自AVA文档:
您必须同步定义所有测试。无法在
setTimeout
,setImmediate
等内定义它们。
fs.readdir
是异步的,所以我很惊讶它实际上适用于macOS,但正如你所经历的那样,它会导致种族问题。我建议切换到fs.readdirSync
或在test.before()
挂钩中执行异步操作,然后利用t.context
。