我在编写一些单元测试时遇到了一些问题,我想在其中删除 neo4j Thingdom 模块的功能。
经过几个小时的失败尝试后,我一直在网上搜索,我发现的唯一参考点是一个用于 sinon.createStubInstance(neo4j.GraphDatabase); 的示例项目;将整个对象存根。对我来说,因为这似乎是一个扔掉的项目,所以我想要一个更细粒度的方法,所以我可以测试它,例如保存节点时的 Thingdom API 概述,你创建它(非持久化)持久化它然后你可以如果您愿意,可以将它索引为三个调用,并且可以在多个特定测试中进行概述,我不确定是否可以通过 createStubInstance 设置来实现(即确定是否调用了一次函数)。
示例“创建节点”函数(这只是为了说明该函数,我正在尝试使用测试来构建它)
User.create = function(data, next){
var node = db.createNode(data);
node.save(function(err, node){
next(null,node);
});
};
我能够存根顶级对象(neo4j.GraphDatabase)的函数,所以这有效:
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();
});
问题出现在我希望运行的下一组测试中,如果调用将节点持久化到数据库的调用被调用(节点,保存)方法:
我不确定这是否可能或可以实现,但我已经尝试了存根的几种变体,但似乎没有工作(在 neo4j.Node、neo4j.Node.prototype 上)并且它们都返回不同的错误,例如 can 't wrap undefined etc. 这可能是由于 createNode 函数生成节点而不是我的代码直接生成的。
有什么我明显做错了,我错过了诀窍还是你不能这样做?如果不是,处理此类事情的最佳策略是什么?