JavaScript を書いています(ブラウザがターゲットです)。手動テストが面倒になって、 Jasmine を使ってテストを書きはじめています。
オブジェクトに含まれる関数(プロパティ)の数が増えてきたので、外から呼ばれることがないものはプライベートメソッドのように扱おうと、クロージャを使って、以下のように書きました。
var Foo = function(foo) {
this.foo = foo;
}
Foo.prototype = (function() {
var _privateMethod = function(data) {
// some code
};
return {
constructor: Foo,
fuga: function(a) {
var data = _privateMethod(a);
// do some stuff
return data;
},
paga: function(b) {
var data = _privateMethod(b);
// do some stuff
return data;
}
};
})();
これはこれでいいのですが、_privateMethod が外から見えないのでユニットテストも書けなくなりました。
こういう場合どうするのかなと思って検索してみたら、そもそもprivateとして隠蔽している以上、それは実装詳細なんだからユニットテストなんてしないんだよ、という意見がありました。そういうものなのでしょうか?
いまの私の場合、テストを書く理由として「先にテストケースを5つか6つほど並べておいて、実装した瞬間に実装が正しいことを確認したいだけ」というTDD的な発想でいました。やりたいことはハッキリしていて、あるインスタンスからなる配列を入れたら、ゴニョっと処理した結果のNumberの配列が返ってくる関数がほしい、具体的には入力がこうで出力がこう、というような程度の話です。どうせREPLやconsole.log (printf) で試したり、コメントに入出力の例を残すのだし、だったらそのままテストコードとして書いちゃいたいな、ということです。
Rubyだとprivateなメソッドでも明示的にレシーバーにメッセージとしてメソッド名を送れば呼び出せるので、こういう迷いはないと思うのですが、一般論としてはユニットテストを書く・書かないということはメソッドの可視性から必然的に決まってくるものなのでしょうか? 言語によってはリフレクションのAPIで頑張るとかなのでしょうか?