2013-08-21 4 views
0

мне нужно создать несколько файлов перед интеграционного теста:мокко, интеграционные тесты JS и асинхронный IO

before(function(done) { 
    fs.mkdir('tmp'); 
    fs.mkdir('tmp/css'); 
    fs.mkdir('tmp/js'); 
    fs.mkdir('tmp/lib'); 
    fs.open('tmp/index.htm', 'w'); 
    fs.open('tmp/some.js', 'w'); 
    fs.open('tmp/some.css', 'w'); 
    fs.open('tmp/css/main.css', 'w'); 
    fs.open('tmp/css/sub.css', 'w'); 
    fs.open('tmp/js/main.js', 'w'); 
    fs.open('tmp/lib/jquery.js', 'w'); 
    done(); 
}); 

Проблема заключается в том, что я получаю:

fs: missing callback Error: ENOENT, mkdir 'tmp/css' 
fs: missing callback Error: ENOENT, mkdir 'tmp/js' 
fs: missing callback Error: ENOENT, mkdir 'tmp/lib' 
fs: missing callback Error: ENOENT, open 'tmp/css/main.css' 
fs: missing callback Error: ENOENT, open 'tmp/css/sub.css' 
fs: missing callback Error: ENOENT, open 'tmp/js/main.js' 
fs: missing callback Error: ENOENT, open 'tmp/lib/jquery.js' 

Я думаю, что проблема в том, что он пытается открыть файлы синхронно до создания каталогов. Я мог бы использовать fs.mkdirSync и передавать обратный вызов каждому, но тогда у меня есть проблема с done();. Как должен выглядеть этот код, если я хочу, чтобы он сделал правильный путь?

ответ

0

Проблема заключается в том, что она асинхронно пытается открыть файлы и нажимать done() до того, как все функции fs вернулись.

Просто измените все, чтобы использовать fs.mkdirSync и fs.openSync. Синхронизация - синхронно, поэтому вам не потребуется обратный вызов; выполнение просто приостанавливается до тех пор, пока fs не вернется. Это было бы ужасно на веб-сервере, где вся остальная работа остановилась бы, но это нормально в тестировании.

Смежные вопросы