1

neo4j Thingdom モジュールの機能をスタブアウトしたいユニット テストを作成する際に問題が発生しています。

数時間失敗した後、私は Web を検索してきましたが、私が見つけた唯一の参照ポイントは、sinon.createStubInstance(neo4j.GraphDatabase); を使用するサンプル プロジェクトでした。オブジェクト全体をスタブアウトします。私にとって、これは使い捨てのプロジェクトのように見えたので、よりきめ細かいアプローチが必要だったので、たとえば、作成したノードを保存するときに Thingdom API の概要をテストできます (非永続化)。必要に応じてインデックスを作成し、どれが 3 つの呼び出しであり、複数の特定のテストで概説することができます。これは、createStubInstance セットアップで達成できるかどうかわかりません (つまり、関数が 1 回呼び出されたかどうかを調べます)。

「ノードの作成」関数の例 (これは関数を説明するためのものであり、テストを使用して構築しようとしています)

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 関数が原因です。

私が明らかに間違っていることはありますか、トリックを見逃していますか、それともこれを行うことはできませんか? そうでない場合、このようなものに対処するための最良の戦術は何ですか?

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 に答える