如何使用sinon来存储neo4j Thingdom模块的函数

我有一些问题,写一些unit testing,我想在这里stub的functionneo4j Thingdom模块。

经过几个小时的失败尝试,我一直在networkingsearch,我发现的唯一参考点是一个示例项目,曾用于sinon.createStubInstance(neo4j.GraphDatabase); 去掉整个对象。 对我来说,因为这似乎是一个扔掉的项目,我想要一个更细粒度的方法,所以我可以testing,例如Thingdom API概述时节省一个节点,你创build它(非持续)坚持它,然后你可以索引它,如果你希望哪些是三个调用,可以在多个特定的testing,我不知道可以用createStubInstance设置(即发现,如果函数被调用一次)可以概述。

例子“创build节点”function(这只是为了说明function,我试图用testing来build立它)

User.create = function(data, next){ var node = db.createNode(data); node.save(function(err, node){ next(null,node); }); }; 

我能够存根顶级对象(neo4j.GraphDatabase)的function,所以这个工作:

  it('should create a node for persistence', function(){ var stub = sinon.stub(neo4j.GraphDatabase.prototype, 'createNode'); User.create({}, res); stub.calledOnce.should.be.ok; stub.restore(); }); 

问题出现在下一组testing中,我希望运行哪些testing,如果调用将节点持久保存到数据库中(节点,保存)方法:

我不知道这是可能的,或者它可以实现,但我已经尝试了几个变种的存根和非似乎工作(在neo4j.Node,neo4j.Node.prototype),他们都回来了不同的错误,如可以没有定义等,这可能是由于createNode函数生成的节点,而不是我的代码直接。

有什么我明目张胆地做错了,我错过了这个把戏,或者你可以不这样做吗? 如果不是什么是最好的战术来处理这样的东西?

一个可能的解决scheme是返回一个存根或模拟对象,让你控制节点创build后发生的事情:

 it('should create a node for persistence and call save', function () { var stubbedNode = { save: sinon.stub().yields(undefined, stubbedNode) }; var stub = sinon.stub(neo4j.GraphDatabase.prototype, 'createNode').returns(stubbedNode); User.create({}, res); stub.calledOnce.should.be.ok; stub.restore(); stubbedNode.save.calledOnce.should.be.ok; }); 

我们不能直接这样做,模块设置的方式与Sinon不兼容。 我们正在做的只是将模块抽象出来,并将其包装在一个简单的外观/适配器中,我们可以在我们的unit testing中存根。

因为我们没有在这个类中调用neo4j模块,所以我们正在集成(并且将在回归testing时validation)testing那个部分,以确保我们正在访问neo4j数据库。