2016-10-04 50 views
0

我想为nodeJS单元测试使用sinonJS框架。问题是,我根本无法让这些sin sp的间谍工作。这是我的代码:sinon间谍没有检测到函数调用

const callback = sinon.spy(someModule.callback) 

mainModule.doSomethingFunction() //someModule.callback function is called inside this function 

assert(callback.calledOnce, 'callback should be called once') 

它只是失败:

AssertionError: callback should be called once

但我记录应该调用的函数里面,它清楚地表明它被调用,兴农间谍刚没有检测到它。我不知道什么是错的?

+1

如果您在问题中包含的是所有待测试的代码,则不会调用它。你创造了间谍,然后不做任何事情。 – cartant

+0

我编辑了这个问题:我在应该被窥探的回调中添加了函数。间谍是不是间谍的目的,而不是做什么?我认为间谍只是间谍,然后我可以测试它侦察到的功能是否已被调用? –

+0

@ VilleMiekk-oja是的,但是你的代码中没有任何函数调用'callback'。也许它应该作为'doSomethingFunction'的参数传递? – Bergi

回答

2

要在间谍包装一个对象的方法,你可以使用sinon这样的:

const callback = sinon.spy(someModule, 'callback'); 
mainModule.doSomethingFunction(); 
assert(callback.calledOnce, 'callback should be called once'); 
callback.restore(); 

请注意,你应该叫restore当您完成解开间谍。

+0

不工作= /。它只是没有检测到回调,即使我完全像你这样写它 –

+0

它对我在一些节点流的单元测试中工作正常。文档是[here](http://sinonjs.org/docs/#sinonspy)。如果你无法使用它,你需要在你的问题中包含[mcve],因为你的问题只包含很少的代码。 – cartant

+0

一个区别是,我们使用ASI和节点。自动分号插入。也许这会影响sinon,因此它不会检测函数调用? –

1

声明const callback = sinon.spy(someModule.callback)创建一个间谍,一旦它被调用,它将调用someModule.callback(顺便说一句,它不是一个常量),但它并不取代someModule.callback函数。若要替换此功能,请使用someModule.callback = sinon.spy(someModule.callback)

+0

请参阅我有关该主题的新问题:http://stackoverflow.com/questions/39868119/how-to-sinon-spy-module-export-utility-functions,你可能能够解决这个问题 –