今日はここまで読んだとか、ここまでやったとかそんな感じの日記です。
第七章、第八章のコード書き終えました。
会員登録、ログイン、ログアウトができるようになりました。
webpackを使ってES2015、Vue.jsのビルド環境を構築する - Motomichi Works Blog
任意のディレクトリ名で良いのですが、frontendディレクトリを作成することにします。
mkdir frontend
以降のコマンドはfrontendディレクトリで実行していきます。
まずnpm initして、適当にenterしますが、エントリーポイントだけmain.jsにしました。
以下のような感じにしています。
{ "name": "frontend", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC" } Is this ok? (yes) yes
npm install -g webpack babel
npm install --save-dev webpack@3 vue-loader vue-template-compiler babel-core babel-loader babel-preset-es2015
npm install --save vue
const path = require('path'); module.exports = { entry: './src/main.js', output: { path: `${__dirname}/result`, filename: 'bundle.js' }, module: { loaders: [ { loader: 'babel-loader', exclude: /node_modules/, test: /\.js[x]?$/, query: { cacheDirectory: true, presets: ['es2015'] } }, { test: /\.vue$/, loader: "vue-loader" }, ] }, resolve: { // モジュールを読み込むときに検索するディレクトリ modules: [path.join(__dirname, 'src'), 'node_modules'], // importするときに省略できる拡張子 extensions: ['.js', '.vue'], alias: { // 例えばmain.js内で `import Vue from 'vue';` と記述したときの`from vue`が表すファイルパスを指定 'vue$': 'vue/dist/vue.esm.js' }, }, plugins: [] }
import Vue from 'vue'; import App from './App'; Vue.config.productionTip = false; /* eslint-disable no-new */ new Vue({ el: '#app', template: '<App/>', components: { App }, });
<template> <div id="app"> <HelloWorld/> </div> </template> <script> import HelloWorld from './components/HelloWorld' export default { name: 'app', components: { HelloWorld } } </script>
<template> <div class="hello"> <h1>{{ msg }}</h1> </div> </template> <script> export default { name: 'HelloWorld', data () { return { msg: 'Welcome to Your Vue.js App' } } } </script>
<!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="utf-8"> <title>vue-tutorial</title> </head> <body> <div id="app"> </div> <script type="text/javascript" src="result/bundle.js"></script> </body> </html>
webpack -d --watch
{ "name": "frontend", "version": "1.0.0", "description": "", "main": "main.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "author": "", "license": "ISC", "devDependencies": { "babel-core": "^6.26.0", "babel-loader": "^7.1.2", "babel-preset-es2015": "^6.24.1", "vue-loader": "^13.6.1", "vue-template-compiler": "^2.5.13", "webpack": "^3.10.0" }, "dependencies": { "vue": "^2.5.13" } }
index.htmlをブラウザで開いて確認します。
Welcome to Your Vue.js App
という文字列が表示されました。
今日はここまで。
絵心が無いとはよく見聞きしますが、多くの場合は以下の2点が大きな要因であると考えています。
効果的な学習方法、練習方法とはどういうものか自分なりに考えたりして文書化しています。
今日は写真や絵を分割して、模写しやすい単位に落とし込んでから模写するという事について書きます。
例えばこのような写真があったとします。
これをそのままそっくりに模写するのは大変です。
でも写真に線を引いて、64分割ぐらいしたらどの指がどのあたりにあるか、誰にでもわかりやすくなります。
256分割したらもっとわかりやすくなります。
写真と同じ縦横比の紙に線を引いて、256分割したら手の形状ぐらいならかなり正確に模写ができそうです。
座標を測って線を引いているだけとも言えますが。
写真だとちょっと難しいかもしれませんが、好きな漫画の一コマだと輪郭線がはっきりしていて、16分割とかそのぐらいでも模写しやすそうですね。
mochaとchaiを使うことについて以前書いた記事です。
この続きという感じでsinon.jsのstubを使っていきます。
前提としてこちらを読んでおくと解りやすいかもしれません。
npm install --save-dev jquery sinon
package.jsonのdevDependenciesは以下の4つになりました。
"devDependencies": { "chai": "^4.0.1", "jquery": "^3.2.1", "mocha": "^3.4.2", "sinon": "^4.1.2" }
application.jsに以下のようなmyObjを書いたことを想定してテストケースも書いていきます。
jQueryの$.ajax()でhttps://example.com/hoge
のAPIにリクエストを送信するオブジェクトです。
window.myObj = { request: function() { return $.ajax({ url: 'https://example.com/hoge', type: 'GET', dataType : 'text', }); }, successFn: function(response){ console.log(response); }, };
describe()とit()はmochaの関数で、chai.assert.strictEqual()はchaiのメソッドです。
sinonをインストールしたのでstub()が使用できます。
describe('example.com/hoge apiへのリクエスト', function() { it('apiが文字列"hoge"を返す', function() { var stub = sinon.stub(window.myObj, 'request'); stub.returns({ done: function(callback) { callback('hoge'); } }); window.myObj.request().done(function(data) { chai.assert.strictEqual('hoge', data); stub.restore(); }); }); });
以下の三行を追記しました。
<script src="node_modules/jquery/dist/jquery.js"></script>
<script src="node_modules/sinon/pkg/sinon.js"></script>
<script src="spec/example_com_hoge_api.spec.js"></script>
以下の通りになりました。
<!DOCTYPE html> <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta charset="utf-8"> <title></title> <meta name="description" content=""> <meta name="author" content=""> <meta name="viewport" content="width=device-width, initial-scale=1"> <!--mochaによるテストの実行結果用cssを読み込み--> <link rel="stylesheet" href="node_modules/mocha/mocha.css"> <link rel="shortcut icon" href=""> </head> <body> <!--mochaによるテストの実行結果が出力されるdiv--> <div id="mocha"> </div> <!--jquery, mocha, chai, sinon を読み込み--> <script src="node_modules/jquery/dist/jquery.js"></script> <script src="node_modules/chai/chai.js"></script> <script src="node_modules/mocha/mocha.js"></script> <script src="node_modules/sinon/pkg/sinon.js"></script> <script> //BDDスタイルを使用するので設定 mocha.setup('bdd'); </script> <!--自分が作っているwebアプリケーションのjsを読み込み--> <script src="js/application.js"></script> <!--テストコードを読み込み--> <script src="spec/add_numbers.spec.js"></script> <script src="spec/example_com_hoge_api.spec.js"></script> <script> // テストを実行 mocha.run(); </script> </body> </html>
js_testing/js_testing_0001.htmlをChromeなどのブラウザで開いてテストを実行してみます。
テストはグリーンでした。
sinon.fakeServer.create()
を使う方法も参考にさせて頂いたページに書いてありました。
これだと実際に使っているAPIやメソッドに対するテストケースではなくて、sinon.jsで代替APIを作ってテストしているに過ぎないので、非同期処理がからむ一連の挙動についてはspyでsetUpをしたらできるのか、実際のAPIにselenium等でリクエストして返却される結果を検証する方が良いのかもうちょっと調査と理解が必要そう。
spyのsetUpとかjQueryのajaxメソッドをテストする例については Spies - Sinon.JS を参照するのがよさそうです。
jasmine2とかtestdouble.jsとかではどうなんでしょうね。