【npm + Karma + Jasmine】JavaScriptの単体テスト環境を構築する

JavaScriptの単体テスト環境構築のまとめ. テストランナーとして「Karma」,テストフレームワーク・アサーションライブラリとして「Jasmine」を使う. PCのグローバル領域にこれらをインストールしても環境構築はできるが,今回はプロジェクト固有のツールとしてインストールする. これによって,PCの環境に依存しないテスト環境が構築できる. ...

April 21, 2014

【Grunt + Karma + Jasmine】CoffeeScriptの開発環境を構築する

Grunt + CoffeeScript + Karma + Jasmine での開発をスタートして数ヶ月たった. ある程度ノウハウも溜まってきたので,メモしておく. CoffeeScript関連ライブラリをセットアップ $ npm init $ npm install $ npm install coffee-script --save-dev $ npm install grunt --save-dev $ npm install grunt-contrib-coffee --save-dev $ npm install grunt-contrib-concat --save-dev $ npm install grunt-contrib-uglify --save-dev $ npm install grunt-contrib-watch --save-dev プロダクトコード # src/hello.coffee hello = -> console.log("Hello world!!") # src/main.coffee hello() user = new User("Tanaka", 24) console.log(user.profile()) # src/user.coffee class User # static private param _uid = 987654321 # constructor constructor: (@NAME, @age) -> # public method profile: -> return @NAME + " : " + @age # private method _toAge = -> @age++ Gruntfile....

【Karma + Jasmine】非同期を含む場合のテストコードをかく

下記のようなケースを考える. 基本的なテスト環境設定はこちら # sample.coffee class Sample getData: -> url = "http://example.com/1/json" xhr = new XMLHttpRequest() xhr.open("GET", url, false) xhr.send() data = null if xhr.status is 200 data = JSON.parse(xhr.responseText) return data .getData のテストを書く際に,xhrの通信部分をスタブしたい. jasmine-ajax,jasmine-jquery を使用する. npm install jasmine-ajax --save-dev npm install jasmine-jquery --save-dev # sampleSpec.coffee describe Sample, -> beforeAll -> jasmine.Ajax.install() afterAll -> jasmine.Ajax.uninstall() describe '.getData', -> beforeEach -> mockedData = {sample: 1} requestUrl = "http://example.com/1/json" jasmine.Ajax.stubRequest(requestUrl).andReturn status: 200 responseText: JSON....

パラメタライズドテストケースをGoogleSpeadsheetで管理する

**google-spreadsheets-parser**を使って, スプレッドシートで管理しているデータをテストで使用する. 背景:データの二重管理をなくしたい あるJSモジュールのパラメタライズドテストコードを書いていた. パラメータとそのテスト結果はGoogleSpreadsheetで表管理していて,ビジネス・エンジニア共に使用していた. はじめはSpreadSheet上にそれらの値をJSで扱える形式にconcatenateとかしてコピペしていたが, バリエーションが膨大になり,データ二重管理の問題が発生しメンテナンスに難があった. 普通にパラメタライズドテストを書くとこんな感じ grunt x karma x jasmine の環境構築手順はこちら. # src/user.coffee class User constructor: (@NAME, @age) -> canDrink: -> parseInt(@age) >= 20 # src/userSpec.coffee describe "User", -> describe "#canDrink", -> assertCanDrink = (name, age, canDrink) -> it "Age:#{age}, CanDrink:#{canDrink}", -> user = new User(name, age) expect(user.canDrink()).toBe(canDrink) # ここのバリエーションが増えてくると管理がツラい target = [ {no: 1, name: 'User1', age: 18, canDrink: false} {no: 2, name: 'User2', age: 19, canDrink: false} {no: 3, name: 'User3', age: 20, canDrink: true} {no: 4, name: 'User4', age: 21, canDrink: true} {no: 5, name: 'User5', age: 22, canDrink: true} ] for t in target assertCanDrink(t....