今日の日記
今日はここまで読んだとか、ここまでやったとかそんな感じの日記です。
平日の電車の中とか寝る前とかにコツコツ読んで、読み終えました。
第五章のコード書き終えました。
routes.rb書いたり、rails test:integrationとかしました。
絵心が無いとはよく見聞きしますが、多くの場合は以下の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とかではどうなんでしょうね。
bundle installをしようと思ったら以下のようなエラーが出ました。
Could not fetch specs from https://rubygems.org/
参考にさせて頂いたページにならって、vagrant reload
したらbundle installできるようになりました。
今日はここまで読んだとか、ここまでやったとかそんな感じの日記です。
scaffoldで作成したアプリケーションの構成をもとにrailsアプリケーションの概要を学習しました。
ここはとりあえず読むだけでいいかなという気がしたのでそのまま第三章に進みます。