我用 Yeoman 运行了很棒的客户端测试。Yeoman 编译我的 CoffeeScript,在服务器中打开测试页面,使用 PhantomJS 访问它并将所有测试结果传递到命令行。这个过程非常 hacky,测试结果通过alert()
消息传递给 Phantom 进程,该进程创建一个临时文件并用 JSON 格式的消息填充它。Yeoman(好吧,Grunt)遍历临时文件,解析测试并将它们显示在命令行中。
我解释这个过程的原因是我想给它添加一些东西。我也进行了服务器端测试。他们使用 mocha 和 supertest 来检查 API 端点和 Redis 客户端以确保数据库状态符合预期。但我想合并这两个测试套件!
我不想为服务器调用编写客户端模拟响应。我不想发送服务器模拟数据。在此过程中,我将更改服务器或客户端,并且测试不会失败。我想做一个真正的集成测试。因此,每当测试在客户端完成时,我想要一个钩子在服务器端运行相关测试(检查数据库状态、会话状态、移动到不同的测试页面)。
有什么解决办法吗?或者,或者,我从哪里开始破解 Yeoman / Grunt / grunt-mocha 来完成这项工作?
我认为 grunt-mocha 中的 Phantom Handlers 是一个很好的起点:
// Handle methods passed from PhantomJS, including Mocha hooks.
var phantomHandlers = {
// Mocha hooks.
suiteStart: function(name) {
unfinished[name] = true;
currentModule = name;
},
suiteDone: function(name, failed, passed, total) {
delete unfinished[name];
},
testStart: function(name) {
currentTest = (currentModule ? currentModule + ' - ' : '') + name;
verbose.write(currentTest + '...');
},
testFail: function(name, result) {
result.testName = currentTest;
failedAssertions.push(result);
},
testDone: function(title, state) {
// Log errors if necessary, otherwise success.
if (state == 'failed') {
// list assertions
if (option('verbose')) {
log.error();
logFailedAssertions();
} else {
log.write('F'.red);
}
} else {
verbose.ok().or.write('.');
}
},
done: function(failed, passed, total, duration) {
var nDuration = parseFloat(duration) || 0;
status.failed += failed;
status.passed += passed;
status.total += total;
status.duration += Math.round(nDuration*100)/100;
// Print assertion errors here, if verbose mode is disabled.
if (!option('verbose')) {
if (failed > 0) {
log.writeln();
logFailedAssertions();
} else {
log.ok();
}
}
},
// Error handlers.
done_fail: function(url) {
verbose.write('Running PhantomJS...').or.write('...');
log.error();
grunt.warn('PhantomJS unable to load "' + url + '" URI.', 90);
},
done_timeout: function() {
log.writeln();
grunt.warn('PhantomJS timed out, possibly due to a missing Mocha run() call.', 90);
},
// console.log pass-through.
// console: console.log.bind(console),
// Debugging messages.
debug: log.debug.bind(log, 'phantomjs')
};
谢谢!这将有赏金。