У меня потрясающие клиентские тесты, которые я запускаю с Йоменом. Йомен компилирует мой CoffeeScript, открывает тестовую страницу на сервере, посещает ее с помощью PhantomJS и передает все результаты тестов в командную строку. Процесс довольно хаки, результаты тестирования передаются через alert()
сообщения в процесс Phantom, который создает временный файл и заполняет его сообщениями как JSON. Йомен (ну, Grunt) перебирает временный файл, анализирует тесты и отображает их в командной строке.
Причина, по которой я объясняла этот процесс, заключается в том, что я хочу добавить к нему несколько вещей. Я также получил тесты на стороне сервера. Они используют mocha и supertest для проверки конечных точек API и клиента Redis, чтобы убедиться, что состояние базы данных соответствует ожиданиям. Но я хочу объединить эти два набора тестов!
Я не хочу писать ответ на макетирование на стороне клиента для вызовов сервера. Я не хочу посылать серверные данные. Где-то по пути я изменю сервер или клиент, и тест не подведет. Я хочу сделать реальное интеграционное тестирование. Таким образом, всякий раз, когда тест заканчивается на стороне клиента, я хочу, чтобы крючок запускал соответствующий тест на стороне сервера (проверка состояния db, состояние сеанса, переход на другую тестовую страницу).
Есть ли какие-либо решения? Или, сдержанно, где я начинаю взламывать Yeoman/Grunt/grunt-mocha, чтобы сделать эту работу?
Я думаю, что обработчики Phantom в grunt-mocha - это хорошее место для запуска:
// 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')
};
Спасибо! Там будет щедрость.