ここでの問題は$()
、メソッドを使用してオブジェクトを返す関数であるということval()
です。したがって、メソッドvalを持つスタブオブジェクトを返すには、$()をスタブする必要があります。
$ = sinon.stub();
$.withArgs('#category').returns(sinon.stub({val: function(){}}));
ただし、ここでの主な間違いは、テストするコードで関数$()を呼び出して、新しいインスタンスを作成できるようにすることです。なんで?クラスに新しいインスタンスを作成せず、コンストラクターに渡すのがベストプラクティスです。入力から値を取得し、それを2倍にして、別の値に書き戻す関数があるとします。
function doubleIt(){
$('#el2').val(('#el1').val() *2);
}
この場合、を呼び出して2つの新しいオブジェクトを作成します$()
。ここで$()
、モックとスタブを返すためにスタブする必要があります。次の例を使用すると、これを回避できます。
function doubleIt(el1, el2){
el2.val(el1.val() *2);
}
前者の場合、スタブを返すために$をスタブする必要がありますが、後者の場合、スタブとスパイを関数に簡単に渡すことができます。
したがって、2番目のシノンテストは次のようになります。
var el1 = sinon.stub({val: function(){}});
el1.returns(2);
var el2 = sinon.spy({val: function(){}}, 'val')
doubleIt(el1, el2)
assert(el2.withArgs(4).calledOnce)
したがって、ここにはdom要素がないため、アプリと同じdomを作成する必要なしに、アプリケーションロジックをテストするだけで済みます。