背景
KnockoutはNode.jsで動かせます。
また、mochaのテストコードを持っています。
テスト対象を入れ替える細工をすれば、自作のKnockoutクローンをテストすることができます。
準備体操 KnockoutをNode.jsで動かす
knockoutをインストールします。
npm i knockout
サンプルコードを作ります。
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')
全文
'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)
に変更して、実行時にテスト対象を指定します。
全文
'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の三角測量っぽい匂いがします。
網羅的なリグレッション向けのテストではなく、ポイントだけを確かめるテストです。
意地悪なテストがないので、特定環境向けのレアケースをカバーする実装なしでテストをクリアできます。
学習向けのクローン実装に向いています。
ただ、テストを全てクリアしても完全なクローンにはならない点には注意してください。