1

我在编写一些单元测试时遇到了一些问题,我想在其中删除 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 函数生成节点而不是我的代码直接生成的。

有什么我明显做错了,我错过了诀窍还是你不能这样做?如果不是,处理此类事情的最佳策略是什么?

4

2 回答 2

1

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

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;
});
于 2013-08-12T10:49:40.813 回答
0

我们不能直接这样做,模块的设置方式不能很好地与Sinon一起使用。我们所做的只是将模块抽象出来并将其包装在一个简单的外观/适配器中,我们可以在我们的单元测试中存根。

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

于 2013-06-08T20:29:04.943 回答