以下のSlideShareが大変参考になったので備忘を兼ねてCoffeeScript版を書いてみた。
JS開発におけるTDDと自動テストツール利用の勘所
http://www.slideshare.net/KojiNakamura/jstdd
目次
- 1. Matcher概観
- 2. beforeEach / afterEach
- 3. Spy
- 4. Async Test
- 5. jQuery code test
1. Matcher概観
- notで否定のMatcherとなる
- expect(x).toEqual(y)
- expect(x).not.toEqual(y)
- expect(x).toBe(y)
 toBeは === による等値チェック
- expect(x).toMatch(pattern)
- expect(x).toBeDefined()
- expect(x).toBeUndefined()
- expect(x).toBeNull()
- expect(x).toBeNaN()
- expect(x).toBeTruthy()
- expect(x).toBeFalsy()
- expect(x).toContain(y)
- expect(x).toBeLessThan(y)
- expect(x).toBeGreaterThan(y)
- expect(x).toBeCloseTo(y, precision)
- expect(function(){fn();}).toThrow(e)
- expect(spy).toHaveBeenCalled()
- expect(spy).toHaveBeenCalledWith(arguments)
2. beforeEach / afterEach
jasmineBeforeEachAfterEachInCoffeeScript.coffee
# 「JS開発におけるTDDと自動テストツール利用の勘所 」より引用。
# http://www.slideshare.net/KojiNakamura/jstdd
describe "Object", ->
  beforeEach ->
    object = new MyObject
  afterEach ->
    # do something...
  describe "#methodA", ->
    it "should be ok", ->
      expect(object.methodA()).toBeTruthy()
  describe "#methodB", ->
    it "should be ok", ->
      expect(object.methodB).toBeTruthy()
  describe "(context)", ->
    beforeEach ->
      object.someMethod()
    describe "#methodC", ->
      it "should be ok", ->
        expect(object.methodC).toBeTruthy()
3. Spy
jasmineSpyOnCoffeeScript.coffee
# 「JS開発におけるTDDと自動テストツール利用の勘所 」より引用。
# http://www.slideshare.net/KojiNakamura/jstdd
 
it "should be called", ->
  obj = 
    method: ->
  spyOn obj, "method" # spyOnメソッドでオブジェクトの特定メソッドをスパイ化
  obj.method()
  expect(obj.method).toHaveBeenCalled() # spy用のMatcherが用意されている
 
test "should be called", ->
  spy = jasmine.createSpy() # スパイ化された関数オブジェクトを作成する
  spy()
  expect(spy).toHaveBeenCalled()
4. Async Test
jasmineAsyncTestOnCoffeeScript.coffee
# 「JS開発におけるTDDと自動テストツール利用の勘所 」より引用。
# http://www.slideshare.net/KojiNakamura/jstdd
 
it "should be async", ->
 
  # 非同期処理ブロックはruns()で定義される
  runs ->
    expect(true).toBeTruthy()
 
  # waits()で次のブロック実行を、指定したミリ秒間保留する
  waits(500)
 
  spy = jasmine.createSpy()
  runs ->
    setTimeout spy, 1000
 
  # waitsFor()はコールバックがtrueを返すまで、次のブロック実行を保留する
  waitsFor ->
    spy.callCount > 0
 
  runs ->
    expect(true).toBeTruthy()
5. jQuery code test
jQueryCodeTestWithJasmineInCoffeescript.coffee
# 「JS開発におけるTDDと自動テストツール利用の勘所 」より引用。
# http://www.slideshare.net/KojiNakamura/jstdd
 
# 元コード
 
$ ->
  $("div li .button")
    .on 'click', ->
      $("div .contents").html("<span>"+$(this).data("mydata")+"</span>")
 
# テスト可能コード
 
$ ->
  $("button") # HTML構造に依存しないidセレクタに変更
    .on 'click', ->
      clickHandler $("contents"), $(this).data("mydata")
 
clickHandler = (elm, data) ->
  elm.html("<span>"+data+"</span>")
 
# テストコード
 
it "should call html() of passed element", ->
  fakeObj = 
    html: jasmine.createSpy()
  clickHandler(fakeObj, "hoge")
  expect(fakeObj.html).toHaveBeenCalledWith("<span>hoge</span>")
ブログやってます:PAPA-tronix !