我如何使用sinon存根函数为neo4j Thingdom模块

How can i use sinon to stub functions for neo4j Thingdom module

本文关键字:neo4j Thingdom 模块 函数 存根 何使用 sinon      更新时间:2023-09-26

我在写一些单元测试时遇到了一些问题,我想把neo4j Thingdom模块的功能存根。

经过几个小时的失败尝试,我一直在网上搜索,我发现的唯一参考点是一个样本项目,用于sinon.createStubInstance(neo4j.GraphDatabase);把整个物体掐灭。给我,因为这似乎是一个扔掉项目我希望更细粒度的方法可以测试,例如Thingdom API概述在保存一个节点创建它时(非持久化)持续下去,然后你可以如果你希望指数三个电话和可以列出多个特定的测试,我不确定可以实现的createStubInstance设置(即发现如果一个函数被称为一次)。

示例"create node"函数(这只是为了说明该函数,我正在尝试使用测试构建它)

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),他们都返回不同的错误,如不能包装未定义等,这可能是由于createNode函数生成节点,而不是我的代码直接。

是否有什么我明显做错了,我错过了技巧,或者你可以不这样做?如果不是,那么处理这种情况的最佳策略是什么?

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

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一起工作。我们所做的只是简单地将模块抽象出来,并将其包装在一个简单的facade/适配器中,以便我们能够在单元测试中存根。

由于我们没有做任何事情,在该类中调用neo4j模块,我们正在集成(并将在回归测试时验证)测试该部分,以确保我们击中neo4j数据库。