Sinon在函数内存根函数

时间:2017-01-16 21:43:23

标签: javascript unit-testing sinon

我在我的工作地点为我们的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是一个没有对象的函数。非常感谢任何见解。

1 个答案:

答案 0 :(得分:2)

如果getQueries似乎不是对象的一部分,它就是全局对象window的一部分,所以sinon.stub(window, 'getQueries', ...)应该可以解决问题。

在这种情况下,可以说更好的方法是将getQueries的结果传递给sort函数。在当前结构中,sort函数有两个作业:获取列表并对其进行排序。您可能会命名函数getSortedQueries,但实际separation of concerns甚至更好,您甚至不需要模拟或存根函数,因为您只需传递一个固定的列表到排序功能。