2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KnockoutをTDDで学ぶ環境作り

Posted at

背景

KnockoutはNode.jsで動かせます。
また、mochaのテストコードを持っています。

テスト対象を入れ替える細工をすれば、自作のKnockoutクローンをテストすることができます。

準備体操 KnockoutをNode.jsで動かす

knockoutをインストールします。

npm i knockout

サンプルコードを作ります。

index.js
const ko = require('knockout'),
  o = ko.observable(0)

o.subscribe((val) => console.log(val))
o('hello')

実行

node .

helloが表示されます。

例:subscribable

Observablesの通知機能を実装しているsubscribableを例にとります。

テストコードの場所

テストコードはspecディレクトリ以下にあります。
subscribableの場合はknockout/subscribableBehaviors.js at master · knockout/knockoutです。

テストコードの抜粋

describe('Subscribable', function() {
    it('Should declare that it is subscribable', function () {
        var instance = new ko.subscribable();
        expect(ko.isSubscribable(instance)).toEqual(true);
    });
}

アサーションがJasmineスタイルで書いてあります。

書き換え

Jasmineスタイルは実行環境を整えるのが面倒です。
assertスタイルに書き換えます。

describe('subscribable', function() {
  it('Should declare that it is subscribable', function() {
    const instance = new ko.subscribable()
    assert.equal(ko.isSubscribable(instance), true)
  })
})

reuquire文を追加します。

const ko = require('knockout'),
  assert = require('assert')

全文

subscribable.js
'use strict'

const ko = require('knockout'),
  assert = require('assert')

describe('subscribable', function() {
  it('Should declare that it is subscribable', function() {
    const instance = new ko.subscribable()
    assert.equal(ko.isSubscribable(instance), true)
  })
})

実行

実行してみましょう。
test/subscribable.jsを作ったとして

npm i knockout mocha
node_modules/mocha/bin/mocha

で、

  subscribable
    ✓ Should declare that it is subscribable


  1 passing (8ms)

が表示されます。

テスト対象の入れ替え

環境変数でテスト対象を入れ替えます。

require('knockout')

require(process.env.TARGET)

に変更して、実行時にテスト対象を指定します。
全文

subscribable.js
'use strict'

const ko = require(process.env.TARGET),
  assert = require('assert')

describe('subscribable', function() {
  it('Should declare that it is subscribable', function() {
    const instance = new ko.subscribable()
    assert.equal(ko.isSubscribable(instance), true)
  })
})

実行

env TARGET=knockout node_modules/mocha/bin/mocha

で、同じように

  subscribable
    ✓ Should declare that it is subscribable


  1 passing (8ms)

が表示されます。

自作のKnockoutクローンがlib/knockoutにあれば

env TARGET='../lib/knockout' node_modules/mocha/bin/mocha

で、テスト可能です。
本家のKnockoutと同じ動きをしているか確認できます。

まとめ

TDDの三角測量でKnockoutクローンを実装できる環境が整いました。
テストを増やしながら、マイペースでKnockoutクローンを実装できます。
自分の実装と本家の実装を見比べれば、より理解が進むことが期待できます。

KnockoutのテストコードからはTDDの三角測量っぽい匂いがします。
網羅的なリグレッション向けのテストではなく、ポイントだけを確かめるテストです。
意地悪なテストがないので、特定環境向けのレアケースをカバーする実装なしでテストをクリアできます。
学習向けのクローン実装に向いています。

ただ、テストを全てクリアしても完全なクローンにはならない点には注意してください。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?