2017-09-27 26 views
1

jsonfileをオブジェクトに読み込む関数の単体テストを作成しようとしています。私はユニットテストのためにnode:コールバック引数を持つ関数を模倣する

jsonfile.readFile(filename, function (err, obj) { 
    //... 
}); 

でファイルを読んで、私は実際にファイルを読み込むのではなく、それは単に固定されたJSONブロックを返却し、コールバックにそれを渡します、ように、この機能をモックとしたいです。

私が問題を抱えているのは、その機能を模擬する方法です。私はsinonを見てきました。これは、モック関数をサポートしていますが、実際に私が嘲笑している関数のカスタム動作を定義する方法を見つけることはできません。 Sinonは、関数が返すもの、呼び出される頻度などを定義することができますが、実際には擬似関数を定義することはできません。私はsinonでこれを行うにはどうすればよい

mock(jsonfile, 'readFile', function(filename, callback) { 
    callback(null, {attr1:"foo"}); 
}); 

基本的に、私はこのような何かをしたいですか?

答えて

0

私が探していた機能がstub.callsFake()です:

> Thing = { 
... meth : function() { console.log(1) } 
... } 
> Thing.meth() 
1 
> var stub = sinon.stub(Thing, 'meth') 
> stub.callsFake(function() { console.log(2) }) 
> Thing.meth() 
2 
> stub.restore() 
> Thing.meth() 
1 

それはmockようには見えませんが、私が何をしたいのかが可能です。

1

callbacksが含まれているため、これはテストでは簡単ではありません。 readFileに渡されたコールバックが正しい引数(この場合はdummyFile)でコールされたことをテストする必要があります。それができるよりも、あなたは、関数にこの抽象にしたい場合は

import sinon from 'sinon' 
    import jsonfile from './jsonfile' 

    const jsonFileMock = sinon.spy(jsonfile, 'readFile'); 
    const callback = sinon.spy(); 

    jsonfile.readFile(callback); 
    jsonFileMock.callsArgWith(1, 'dummyFileName'); 

    expect(callback.calledWith('dummyFileName')).to.be.true; 
    jsonFileMock.restore(); 

何かのように:

function mock(module, method, ...callbacks){ 
    const stub = sinon.stub(jsonfile, 'readFile'); 
    callbacks.forEach((callback, index) => { 
    stub.callsArgWith(index, callback); 
    }); 
} 
+1

それは私がやろうとしていることではありません。私は私のテストケースで定義した無名関数を呼び出す 'readFile'関数を模倣しようとしています(これは将来私が他の多くの関数で行うことですが、これは単なる例です)。 – ewok

1

しかし、実際には、なぜあなただ​​けの(同じ定義を持つ関数によってreadFileのに代わるものではありません。それを使ってコードを分解することはありません)。そしてちょうどあなたの模擬データを返します。

jsonfile.readFile = function(filePath, callback) { 
    callback(null, { mockData: "foo" }); 
}; 

そのようです。

あなたが定義に対処する必要はありませんそれ以外の場合、あなたがプロキシを使用することができます。

const jsonfile = { 
 
    readFile: function(filename, callback) { 
 
     callback(); 
 
    } 
 
}; 
 

 
// intercept every call to readFile and always return the mock data 
 
jsonfile.readFile = new Proxy(jsonfile.readFile, { 
 
    apply: function(target, thisArg, args) { 
 
     return args[1](null, { someMocking: "" }); 
 
    } 
 
}); 
 

 
// call readFile as usual 
 
jsonfile.readFile('testfile', function(err, result) { 
 
    console.log(result); 
 
});

プロキシは、インターセプタとして働いています。

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Proxy

関連する問題