这里的问题是,$()
是一个函数,返回一个对象的方法val()
。所以你必须存根$()才能返回val方法的存根对象。
$ = sinon.stub();
$.withArgs('#category').returns(sinon.stub({val: function(){}}));
但是,这里主要的错误是让你想测试的代码调用函数$()来创建新的实例。为什么?最好的做法是不要在你的类中创建新的实例,而是将它们传递给构造函数。比方说,你有功能,将得到的值进行输入的,加倍,并把它写回另一:
function doubleIt(){
$('#el2').val(('#el1').val() *2);
}
在这种情况下,您可以通过调用$()
创建2个新的对象。现在你必须存根$()
返回一个模拟和存根。使用下面的例子就可以避免这一点:
function doubleIt(el1, el2){
el2.val(el1.val() *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的测试你的应用程序逻辑在你的应用程序。
我没有使用过这些库,但`$`实际上是一个对象(函数是JavaScript中的对象)。除此之外,当没有选择任何东西时,jQuery函数就会工作 - `.val()`只会返回'undefined`。 – pimvdb 2011-12-15 17:17:40
我得到`.VAL()`返回`undefined`,但我怎么能那么存根来测试我的'===“”'? – swilliams 2011-12-15 17:35:03