使用SinonJS存根(与rewire)

我有一个function:

var publish = function(a, b, c) { main = a + getWriterName(b,c); } 

getWriterName是另一个函数:

 var getWriterName = function(b,c) { return 'Hello World'; } 

我想testing“发布”function,但我不想在testing“发布”时运行“getWriterName”函数。 我觉得我存根getWriterName函数,因为我不想每次运行我testing“发布”,但我该怎么做呢? 我做了这样的事情:

 var sandbox = sinon.sandbox.create(); sandbox.stub(getWriterName).returns('done'); 

但是这给了我一个错误

TypeError:尝试将未定义的属性undefined作为函数进行封装

如果我在写道上,那么我的st What怎么了?

编辑:我使用rewire,所以会喜欢解决scheme使用rewire

从sinon文档:“ sinon.sandbox.create(config)方法大多是集成function,作为Sinon.JS的最终用户,您可能不需要它。

通常你用语法创build一个sinon存根:

 sinon.stub(obj, 'property, function(){ //do something } 

假设您的文件中的某个位置正在导出这两个函数

 //somefile.js var publish = function(a, b, c) { main = a + getWriterName(b,c); } var getWriterName = function(b,c) { return 'Hello World'; } exports.getWriterName = getWriterName; exports.publish = publish; 

在你的testing中导入它们:

 var someFile = require('./somefile.js'); 

并试图找出你想要的方法:

 sinon.stub(someFile, 'getWriterName', function(b, c) { return 'done' }); 

你会发现这也是行不通的。 这是因为sinon实际上不能真正地存储一个必需的方法,除非它可以作为你需要的文件的属性来访问它。 为了这个工作,你需要这样做:

//somefile.js

 var getWriterName = function(b,c) { return 'Hello World'; } exports.getWriterName = getWriterName; var publish = function(a, b, c) { main = a + exports.getWriterName(b,c); } exports.publish = publish; 

现在,getWriterName可以在您将testing中的函数导入文件时进行存取。 你会这样做,就像上面的例子:

 sinon.stub(someFile, 'getWriterName', function(b, c) { return 'done' }); 

可以用下面的方法撤销它:

 someFile.getWriterName.restore(); 

这解决了我的问题:

如果我的函数在一个名为main.js的文件中,那么首先我将重新连接文件:

 var main = rewire('main'); 

然后存根被调用的任何其他函数在我的情况下,当我必须存根getWriterName我会做:

 main.__set__('getWriterName', function(b, c) { return 'Something Else' } 

最后在完成使用之后,再做

 main.restore(); 

这就是Sinon如何与Rewire一起使用来存根function。 在这种情况下重新接线是特别有用的,如果stubbed函数是私人的。

 it('getWriteName always returns "Hello World"', function() { var stub = sandbox.stub(); stub.returns('Hello World'); var unset = log.__set__('getWriterName', stub); // your test and expectations here unset(); // it's always good to restore the previous state });