Выполнение тестов в ваших Laravel Elixir проектах с использованием Karma, Jasmine & Webpack
Вы хотите выполнять тестирование ваших javascript файлов внутри вашего проекта Laravel Elixir, но не знаете, с чего начать? Нет необходимости искать дальше, с Jasmine, Karma и Webpack вы добьетесь этого в кратчайшие сроки.
Цель данной статьи состоит в том, чтобы служить отправной точкой для начала работы, и, если честно, у меня нет желания выяснять, что и как вы хотите тестировать в вашем проекте.
В этом уроке я буду использовать Vue, т.к. для меня он является наилучшим фреймворком, но не бойтесь адаптировать данный способ для того, что нравится вам.
Примечание: Тестирование было проведено на Laravel 5.3 (DEV ветка), так же это должно работать на версии 5.2 и ниже. Проект уже настроен на использование Webpack. Laravel 5.3 поставляется с WebPack из коробки.
Файл конфигурации необходим Karma для того, чтобы выполнять тесты. Karma по умолчанию считывает конфигурационный файл с именем “karma.config.js”, необходимый для запуска. Этот файл должен быть создан в корневом каталоге вашего проекта Laravel и должен содержать следующее:
Примечание: Не могу понять, почему PhantomJS лончер не работает при записи в ES6. Будет обновлено, когда я найду, как это пофиксить.
Если у вас еще нет файла webpack.config в корневом каталоге вашего проекта, создайте его со следующим содержанием:
На данный момент я имею следующее:
Мы просто воссоздадим пример Markdown редактора с официального сайта Vue. Я предполагаю, что вы уже установили Vue и Marked с помощью NPM.
(А) Теперь зарегистрируем наш компонент Vue в “app.js”
Этот файл служит точкой входа нашего приложения и будет скомпилирован при запуске:
(B) И наконец, давайте напишем простой тест в “tests/Editor.spec.js”
Используемые ресурсы
Цель данной статьи состоит в том, чтобы служить отправной точкой для начала работы, и, если честно, у меня нет желания выяснять, что и как вы хотите тестировать в вашем проекте.
В этом уроке я буду использовать Vue, т.к. для меня он является наилучшим фреймворком, но не бойтесь адаптировать данный способ для того, что нравится вам.
Примечание: Тестирование было проведено на Laravel 5.3 (DEV ветка), так же это должно работать на версии 5.2 и ниже. Проект уже настроен на использование Webpack. Laravel 5.3 поставляется с WebPack из коробки.
Шаг 1: Установка необходимых зависимостей через NPM
Для запуска нам нужно установить несколько пакетов на Node с помощью NPM. Ниже перечислены пакеты и karma-* плагины, необходимые для создания простого тестирования.“karma”Просто введите это в вашей консоли, чтобы установить эти зависимости и сохранить их в файл package.json как dev-зависимости:
“jasmine-core”
“karma-jasmine”
“karma-chrome-launcher”
“karma-firefox-launcher”
“karma-phantomjs-launcher”
“karma-webpack”
“karma-babel-preprocessor”
npm install karma jasmine-core karma-babel-preprocessor karma-phantomjs-launcher karma-jasmine karma-webpack karma-firefox-launcher karma-chrome-launcher — save-dev
Шаг 2: создание файла конфигурации для Karma (karma.config.js)
Karma - это, попросту говоря, тест-раннер для js, который удовлетворит все ваши потребности. По сути, Karma для JS - это как PHPUnit для PHP.Файл конфигурации необходим Karma для того, чтобы выполнять тесты. Karma по умолчанию считывает конфигурационный файл с именем “karma.config.js”, необходимый для запуска. Этот файл должен быть создан в корневом каталоге вашего проекта Laravel и должен содержать следующее:
// Karma configuration
var webpackConf = require('./webpack.config.js');
delete webpackConf.entry
module.exports = function(config) {
config.set({
frameworks: ['jasmine'],
port: 9876, // web server port
colors: true,
logLevel: config.LOG_INFO,
reporters: ['progress'], // dots, progress
autoWatch: true, // enable / disable watching files & then run tests
browsers: ['Chrome'], //'PhantomJS', 'Firefox',
singleRun: true, // if true, Karma captures browsers, runs the tests and exits
concurrency: Infinity, // how many browser should be started simultaneous
webpack: webpackConf, // Pass your webpack.config.js file's content
webpackMiddleware: {
noInfo: true,
stats: 'errors-only'
},
/**
* base path that will be used to resolve all patterns (eg. files, exclude)
* This should be your JS Folder where all source javascript
* files are located.
*/
basePath: './resources/assets/js/',
/**
* list of files / patterns to load in the browser
* The pattern just says load all files within a
* tests directory including subdirectories
**/
files: [
{pattern: 'tests/**/*.js', watched: false},
],
// list of files to exclude
exclude: [
],
/**
* pre-process matching files before serving them to the browser
* Add your App entry point as well as your Tests files which should be
* stored under the tests directory in your basePath also this expects
* you to save your tests with a .spec.js file extension. This assumes we
* are writing in ES6 and would run our file through babel before webpack.
*/
preprocessors: {
'app.js': ['webpack', 'babel'],
'tests/**/*.spec.js': ['babel', 'webpack']
},
})
}
Примечание: Не могу понять, почему PhantomJS лончер не работает при записи в ES6. Будет обновлено, когда я найду, как это пофиксить.
Если у вас еще нет файла webpack.config в корневом каталоге вашего проекта, создайте его со следующим содержанием:
module.exports = {
// your Webpack specific config content
}
Шаг 3: Создайте свои тесты в пределах каталога “tests”
Я хотел бы в общих чертах дать вам понятие, как создавать компоненты, регистрировать их с помощью Vue, создавать базовые юнит-тесты для этих компонентов, ну и продемонстрировать рабочий процесс в действии.На данный момент я имею следующее:
- Файл app.js находится в “resources/assets/js/app.js”;
- Директория “tests” создана в “resources/assets/js/tests”;
- Мои юнит-тесты размещены в “resources/assets/js/tests/unit”;
- Файлы тестов оканчиваются на .spec.js;
- Мои компоненты находятся в “resources/assets/js/components”;
- Я пишу на javascript спецификации ES6/ES2015;
- Моя базовая директория для js файлов создана в “resources/assets/js/”.
Мы просто воссоздадим пример Markdown редактора с официального сайта Vue. Я предполагаю, что вы уже установили Vue и Marked с помощью NPM.
import marked from 'marked';
export default {
template: `
<div :id="editor">
<textarea v-model="input" debounce="300"></textarea>
<div class="editorview" v-html="input | marked"></div>
</div>
`,
data() {
return { input: '# Hello!' }
},
filters: {
marked: marked
}
}
(А) Теперь зарегистрируем наш компонент Vue в “app.js”
Этот файл служит точкой входа нашего приложения и будет скомпилирован при запуске:
mix.webpack(‘app.js’);
/** Component **/
import Vue from 'vue';
import Editor from './components/Editor';
var app = new Vue({
el: 'body',
components: { Editor }
});
(B) И наконец, давайте напишем простой тест в “tests/Editor.spec.js”
// Test File "Editor.spec.js"
import Editor from '../../components/Editor.js';
describe('Editor', () => {
it('should set correct default data', function () {
expect(typeof Editor.data).toBe('function')
var defaultData = Editor.data()
expect(defaultData.input).toBe('# Hello!')
});
});
Шаг 4: Запустите тесты с помощью Karma
Для того, что бы запустить тест, просто введите в консоли:./node_modules/karma/bin/karma startВы можете сделать это проще, создав алиас, либо просто установив Karma CLI через NPM.
npm install -g karma-cliВ качестве альтернативы вы можете использовать CLI для создания файла конфигурации:
karma start
karma init karma.conf.jsВот и всё. Проще некуда!
Используемые ресурсы
- Karma Config
- Сайт Babel Js
- Компоненты Vue для юнит-тестирования
- Сайт Jasmine
- Vue Specific Karma Cofig от создателя Vue