以前、karma-html2js-preprocessorを利用して、このようなエントリを書きました。
Karmaでkarma-html2js-preprocessorを使ってHTMLを読み込んでテストする - CLOVER
この時は、以下の組み合わせで環境、コードを用意してテストを書いたのでした。
- Babel
- Browserify
- Karma(ランチャーはChrome)
- karma-html2js-preprocessorでHTMLからのDOMを利用
- コード自体にはjQueryを利用
- テストコードは、Mocha+Chai
今回、Karmaのランチャー部をPhantomJsに置き換えてみたいと思います。
KarmaとPhantomJsを組み合わせるには、karma-phantomjs-launcherを利用します。
GitHub - karma-runner/karma-phantomjs-launcher: A Karma plugin. Launcher for PhantomJS.
準備
まずは、必要なnpmモジュールをインストール。
## Babel $ npm install --save-dev babelify babel-preset-es2015 $ npm install --save babel-polyfill ## Browserify $ npm install --save-dev browserify watchify ## Mocha, Chai $ npm install --save-dev mocha chai ## Karma $ npm install --save-dev karma karma-browserify karma-chai karma-mocha ## Karma & PhantomJs $ npm install --save-dev karma-phantomjs-launcher $ npm install --save-dev phantomjs-prebuilt ## Karma Html2Js Preprocessor $ npm install --save-dev karma-html2js-preprocessor ## jQuery $ npm install --save jquery
「karma-phantomjs-launcher」と「phantomjs-prebuilt」を入れておくところが、ポイントです。
あとはBabelの設定と
$ echo '{ "presets": ["es2015"] }' > .babelrc
Karmaの設定。
$ ./node_modules/karma/bin/karma init
Karmaの設定で変えたところは、このあたりです。
// frameworks to use // available frameworks: https://npmjs.org/browse/keyword/karma-adapter frameworks: ['browserify', 'mocha', 'chai'], browserify: { transform: ['babelify'] }, // PhantomJs phantomjsLauncher: { // Have phantomjs exit if a ResourceError is encountered (useful if karma exits without killing phantom) exitOnResourceError: true }, // list of files / patterns to load in the browser files: [ 'src/**/*.js', 'test/**/*-test.js', 'html/**/*.html' ], // list of files to exclude exclude: [ ], // preprocess matching files before serving them to the browser // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor preprocessors: { 'src/**/*.js': ['browserify'], 'test/**/*-test.js': ['browserify'], '**/*.html': ['html2js'] },
phantomjsLauncherの設定を入れています。リソースエラー時に、PhantomJsをexitする設定のようですが…。
あと、今回は自動生成時に選択したのですが、ブラウザをPhantomJsにしています。
// start these browsers // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher browsers: ['PhantomJS'],
テストの実行は、「test:karma」となるようにpackage.jsonに定義します。
"scripts": { "test:karma": "karma start", "test": "echo \"Error: no test specified\" && exit 1" },
コードの用意
コード自体は、元ネタのエントリと同じものを利用します。
テスト対象のコード。
src/click-add.js
import "babel-polyfill"; import $ from "jquery"; export function bindClick() { $("#button").bind("click", () => { $("#messages").append("<div class='added-message'>Hello Karma!!</div>"); }); };
テストコード。
test/click-add-test.js
import "chai"; import $ from "jquery"; const should = chai.should(); import { bindClick } from "../src/click-add.js"; describe("click-add test", () => { it("click triple from HTML file.", () => { document.body.innerHTML = __html__["html/index.html"]; bindClick(); let button = document.getElementById("button"); Array.from(Array(3), (v, k) => k + 1).forEach(i => button.click()); let messages = document.getElementsByClassName("added-message"); messages.should.to.have.lengthOf(3); let messageTexts = Array.from(messages).map(e => e.textContent); messageTexts .should .deep .equal(["Hello Karma!!", "Hello Karma!!", "Hello Karma!!"]); }); });
HTMLファイル。
html/index.html
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Karma Test Code</title> </head> <body> <div id="messages"></div> <input id="button" type="button" value="クリック!!"> </body> </html>
実行
それでは、テストを実行してみます。
$ npm run test:karma > karma-html2js-preprocessor-with-phantomjs@1.0.0 test:karma /path/to/karma-html2js-preprocessor-with-phantomjs > karma start 17 05 2016 15:55:30.347:INFO [framework.browserify]: registering rebuild (autoWatch=true) 17 05 2016 15:55:33.752:INFO [framework.browserify]: 734545 bytes written (2.66 seconds) 17 05 2016 15:55:33.755:INFO [framework.browserify]: bundle built 17 05 2016 15:55:33.758:WARN [karma]: No captured browser, open http://localhost:9876/ 17 05 2016 15:55:33.764:INFO [karma]: Karma v0.13.22 server started at http://localhost:9876/ 17 05 2016 15:55:33.774:INFO [launcher]: Starting browser PhantomJS 17 05 2016 15:55:34.372:INFO [PhantomJS 2.1.1 (Linux 0.0.0)]: Connected on socket /#Jwo3hVD3Av7kX5_aAAAA with id 57482169 PhantomJS 2.1.1 (Linux 0.0.0): Executed 1 of 1 SUCCESS (0.04 secs / 0.009 secs)
とりあえず、うまくいきましたっと。
ChromeからPhantomJsに変えると、動かすのにちょっとハマったりするかな?と思っていましたが、このくらいの内容ならそれほどでもないみたいでした。
使えそうなところでは、導入したいなぁと思います。