使用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 });