Возвращаясь к вопросу через 4 года, теперь у меня есть лучшее решение.
Создание тестируемой версии вашего кода в качестве шага сборки.
Скажем, я использую Gulp для минимизации своегоJavaScript, и мой код выглядит так:
var a = function() {}
window.b = function() {}
Не отсутствие замыкания.Теперь я настроил задачу gulp и заставил ее смотреть мой код, например:
gulp.task('js', function () {
return gulp.src([dirs.js.src, '*.js'].join('/'))
.pipe(wrap('(function() {\n<%= contents %>\n})();'))
.pipe(jshint())
.pipe(jshint.reporter('default'))
.pipe(gulp.dest(dirs.js.dest));
});
. Это обернет мой код в IIFE, создавая следующий вывод:
(function() {
var a = function() {}
window.b = function() {}
)();
Генерацияtestable version
Теперь я добавляю еще одну задачу Gulp, например:
gulp.task('testJs', function () {
return gulp.src([dirs.test.src, '*.js'].join('/'))
.pipe(wrap(
[
'(function() {',
'<%= contents %>',
'// Smuggle locals out of closure for testing',
'window.a = a;',
'})();'
].join('\n')
))
.pipe(concat(package.name + '.testable.js'))
.pipe(gulp.dest(dirs.test.dest));
});
. В моем тестовом каталоге будет сгенерирован следующий небезопасный, но тестируемый код:
(function() {
var a = function() {}
window.b = function() {}
// Smuggle locals out of closure for testing
window.a = a;
)();
Добавьте задачу наблюдения ...
gulp.task('watch', function() {
gulp.watch([dirs.js.src, '**', '*.js'].join('/'), ['js', 'testJs']);
});
... и все готово.
См. Здесь
См. Пример для примера:
https://github.com/forwardadvance/ng-tweets