テストを考慮した singleton の ES6 export
Posted: Updated:
テスト時の singleton を避けたい export
facebook/flux のサンプル準拠だと、Store や Dispatcher が singleton でテストを書きづらいことがあるので、普段使う singleton インスタンスと、テストで使う class オブジェクトを両方 export
した。
import AppDispatcher, {Action, Payload} from '../dispatcher/AppDispatcher'; import * as Events from 'events'; const CHANGE_EVENT = 'change'; // 生クラスの export export class AcmeStore extends Events.EventEmitter { dispatchToken: string; constructor() { super(); this.dispatchToken = AppDispatcher.register(this.handleDispatch.bind(this)); } handleDispatch(payload) { /* abstract */ } private emitChange() { this.emit(CHANGE_EVENT); } addChangeListener(callback) { this.addListener(CHANGE_EVENT, callback); } removeChangeListener(callback) { this.removeListener(CHANGE_EVENT, callback); } } // singleton インスタンスの export export default new AcmeStore();
import するとき
単純です。はい。そもそも伝統的な Klass.getInstance()
方式でも悪くはないんですけど、普段使いでメソッドコールしなくて済むほうが良いかなと。
let klass = require('./Klass').getInstance()
とか書けないという気持ちもある。
普段使い
import AcmeStore from '../stores/AcmeStore'; AcmeStore.addChangeListener(function() { // hogehoge });
テスト使い
import { AcmeStore } from '../stores/AcmeStore'; describe('AcmeStoreTest', function() { it('hogehoge', function() { let store = new AcmeStore(); }); });
facebook/flux
ボイラープレート処理を BaseComponent
, BaseStore
的なところに追いやれば、少なくとも薄いタイプの亜種 flux は使わなくても十分なのではと感じ始めた今日この頃。
isomorphic 全部入りとかになると話が違ってくるとは思うんだけど、fluxible とか