在sinon.js中扼杀和/或嘲笑一堂课?

我为我的应用程序创build了一个数据库包装器,如下所示。 为了testing它,我显然希望replace实际的数据库库。 我可以创build一个新的类来嘲笑query方法,并捕获所有的input,但使用sinon.js似乎更合适,但我将如何使用它?
sinon.jsmockstubfunction是我应该使用的吗?

 wrapper = (function() { function wrapper() {} wrapper.db = require("database"); wrapper.prototype.insertUser = function(doc) { return this.db.query("INSERT INTO USERS..."); }; return wrapper; })(); 

你可以使用这两个。

模拟有一个预期的有序行为,如果不正确的话,会给你一个错误。

存根类似于模拟,但没有顺序,所以你可以按你想要的方式调用你的方法。 根据我的经验,你几乎不需要模拟。

他们两个都会用你的方法替代一个空方法,或者如果你通过一个方法就closures。 这将是这样的:

 stub = sinon.stub(wrapper , 'insertUser ', function () { return true; }); 

然后添加期望的行为来检查是否发生。

我喜欢用茉莉花和茉莉花来检查testing。

首先,我会修改你的类定义(大写的类名和修复数据库分配):

 var Wrapper = (function() { function Wrapper() { this.db = require("database"); } Wrapper.prototype.insertUser = function(doc) { return this.db.query("INSERT INTO USERS..."); }; return Wrapper; })(); 

把整个class级存根

 var WrapperStub = sinon.spy(function() { return sinon.createStubInstance(Wrapper); }); 

sinon.createStubInstance将创build一个Wrapper实例,其中每个方法都是一个存根。 sinon.spy将允许我们窥视类实例化。

所以你可以这样练习:

 // verify instantiation var wrapper = new WrapperStub(); expect(WrapperStub).to.have.been.calledWithNew; // verify method stub wrapper.insertUser.returns('data'); expect(wrapper.insertUser()).to.equal('data'); expect(wrapper.insertUser).to.have.been.calledOnce; 

(断言使用柴和sin cha )

我只是说“练习”,因为这段代码不是一个实际的unit testing。 实例化和方法调用将由您的主题进行testing。

现在,如果你想模拟一个由require()注入的依赖项,例如db = require('database') ,你可以尝试一个像Jest (但不使用sinon)或者sinonquire这样的testing工具灵感来自Jest,但是用它与sinon加上你最喜欢的testing工具(我的是mocha )。 在内部, sinonquire使用上面所示的结合sinon.spysinon.createStubInstance来存根类的相同技术。