Backbone.js

Rails3.2でJasmineをつかってBackbone.jsのCollectionをテストしてみる

投稿日:

 

前回

Rails3.2でJasmineをつかってBackbone.jsのModelをテストしてみる

 

Developing Backbone.js Applications

addyosmani.github.com/backbone-fundamentals/#tdd-with-backbone

この本は「Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported」ライセンスのもとに発行されているとのこと

ライセンスの日本語はつぎのとおり

creativecommons.org/licenses/by-nc-sa/3.0/deed.ja

pdfとかepubはここから

github.com/addyosmani/backbone-fundamentals

 

参照

addyosmani.github.com/backbone-fundamentals/#collections-1

[important]注意!

この記事はネタ元を翻訳したものではなく、ななめ読みですのでまったく正確ではありません

ただ、コードは実際に試してみたうえで感想を書いています[/important]

はじめに

コレクションについてテストしようと思うときいくつか浮かぶのが

  • Todoモデルを追加するときに単オブジェクトとしても配列としても追加できるかどうかを確かめる
  • ベースURLのようなattributeが期待した通りの値かどうか確かめる
  • 目的を果たしてTodoの状態をdone:trueにしたとき、コレクションが目的達成アイテムと残っているアイテムをいくつあると判断するかを確かめる

最後の1つは学習用に残して最初の2つをカバーしてくれるらしい

準備

コードを書きはじめる前に自分の環境でテストのための準備をする必要がある

まず、spec/javascripts/collections/todolist_spec.js.coffeeを作成する

これでエラーが出るのを確かめて、app/assets/javascripts/collections/todolist.js.coffeeを作成する(中身はまだない)

これでテストが通ることを確認する

最初のテスト

順番にやっていこう、まず最初の2行から

これはパスする

Bbtodo.Collections.TodoListが見つからないのでつくる

つぎの1行

lengthはBackbone.CollectionのメソッドなのでBbtodo.Collections.TodoListを拡張する

つぎはオブジェクトを追加するとコレクションは1になるか

パスした

つぎに配列を追加してみる(CoffeeScriptらしく書けない・・・)

なんなくパス

ちなみにカッコがなければ普通の英文ぽくなって望ましいんだけど、CoffeeScriptの()省略はメソッドチェインのときには使えない次にメソッドが続かない時だけうまくつかえる

2番めのテスト

次のテストはurl

これはエラーが出るのでurlを書き加える

これでパスした・・・て最初の2つはすごく簡単

3番目のテスト

3つ目のテストのために、構成としてはCollectionにもう終わった数をかぞえるdone()っていうメソッドとまだ残っている数をかぞえるremaining()っていうメソッドを用意して、最初からstate:doneのアイテムと2つのfalseのアイテムを用意して1つをdoneにしたときにdone()とremaining()をテストすればいいんじゃないか。。だって

まあ、メソッドの正解は書いてあるのでテストの方に挑戦してみる

テストの取っ掛かりは、こんな感じで3つアイテムを用意して、done()とremaining()をテストする

見本のメソッドを書くとテストが通った

filterとwithoutは_(アンダースコア)という便利ライブラリ集のメソッドでBackboneではCollectionからほとんど使えるようになっている

filterは@(thisコレクション)から条件(ここではtodo.get(‘done’) == true)に合致したものだけを配列で返す

withoutは@(thisコレクション)から条件に合致しないものだけを配列で返す

applyはよくわからないけど、たぶん@のうち@done()に合致した値おのおのについて各値 == trueという条件を返しているんだと思う

 

さて、次にfalseのtodoをtrueにして、done()とremaining()の数をかぞえるだけだけど、どうやって指定するか

たぶん一番単純なテストは次のようなもの

 

これで無事にdone()とremaining()は確認できたかな

 

ちなみに、答えにはnextOrder()とcomparator()というメソッドが書いてある

nextOrder()はたぶん新しいorderをつけるメソッドで、comparatorはtodoのorderを取得するメソッドぽい

Backboneのコレクションではcomparetorメソッドは定義されていないけど、定義されるとその順番に並べ替えられるらしい

気になったのは

とかになってないのは、きっとelseだと全部の条件を読み込んじゃう分無駄なんだろうなあと予測

 

やり方というかワンポイント

実際にはこんなに一発ではコードを書けないので、テストを書いたらその値をconsole.logに出して値をたしかめながらやった

自分の設定では、44261番ポートにサーバーが立ったので、サーバアドレス:44261/jasmineでつながった

ここでブラウザからコンソールを出せば値が確認できる

 

-Backbone.js
-,

執筆者: