我在我的工作地点为我们的javascript文件提供测试。我决定使用Mocha,Chai和Sinon库来帮助测试。我开始编写单元测试,用于不需要太多重构的函数,并遇到了这个我不太了解的有趣案例。
function getQueries() {
code that returns queries in an array -> ['one', 'two', 'three']
}
function sort(col, type) {
var queries = getQueries();
some code that sorts these queries
return sorted array
}
因为我是单元测试sort函数所以我想将getQueries()存根以返回一个虚拟列表。
var queries = ['one', 'two', 'three'];
sinon.stub(getQueries).returns(queries);
以上代码无法正常运行错误消息:
TypeError: Attempted to wrap undefined property undefined as function
at Object.wrapMethod (file://node_modules/sinon/pkg/sinon-1.17.7.js:1359:29)
at Object.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:3459:26)
at F.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:4200:44)
at Context.obj.stub (file://node_modules/sinon/pkg/sinon-1.17.7.js:4215:37)
at Context.<anonymous> (unit_tests/unit_test.js:154:10)
at Context.sinonSandboxedTest (file:/node_modules/sinon/pkg/sinon-1.17.7.js:6069:39)
但是,下面的代码确实可以正常运行。
var queries = ['one', 'two', 'three'];
getQueries = sinon.stub();
getQueries.returns(queries);
我不完全理解为什么这个代码有效,而上面的代码却没有。我知道sinon.stub(obj,方法,函数)的语法,但getQueries是一个没有对象的函数。非常感谢任何见解。
答案 0 :(得分:2)
如果getQueries
似乎不是对象的一部分,它就是全局对象window
的一部分,所以sinon.stub(window, 'getQueries', ...)
应该可以解决问题。
在这种情况下,可以说更好的方法是将getQueries的结果传递给sort函数。在当前结构中,sort
函数有两个作业:获取列表并对其进行排序。您可能会命名函数getSortedQueries
,但实际separation of concerns甚至更好,您甚至不需要模拟或存根函数,因为您只需传递一个固定的列表到排序功能。