2017-01-24 20 views
1

Node.jsアプリケーションのユニットテストは初めてです。私のアプリケーションは、フィルタリングの後、CSVファイルをJSONに変換します。ユニットMocha、Chai、およびSinonを使用したNode.jsアプリケーションのテスト

var fs = require('fs'); 
var readline = require('readline'); 

module.exports = ((year) => { 
if (typeof year !== "number" || isNaN(year)){ 
    throw new Error("Not a number"); 
} 
var rlEmitter = readline.createInterface({ 
    input: fs.createReadStream('./datasmall.csv'), 
    output: fs.createWriteStream('./data.json') 
}); 

rlEmitter.on('line', function(line) { 
    /*Filter CSV line by line*/ 
}); 
rlEmitter.on('close', function() { 
    /*Write to JSON*/ 
}); 
}); 

私は、特にSinonスパイ、スタブ、モックを使用してコードをユニットテストしたいと考えています。たとえば、createIterfaceというスパイ、「close」イベントのコールバックは1回だけ呼び出されます。同様に、 "行"イベントのコールバックは、csvの行数に対応する回数だけ呼び出されます。 また、CSVが開発期間中に存在しない場合、そのCSVを偽装する方法はありますか?私が試した

一つの試験があるが、これは正しい方法であるかどうかわからない:適切なユニットテストの

describe("Test createInterface method of readline", function(err){ 
    it("should be called only once", function() { 
     var spyCreateInterface = sinon.spy(readline, 'createInterface'); 
     convert(2016); 
     readline.createInterface.restore(); 
     sinon.assert.calledOnce(spyCreateInterface); 
}); 

追加提案高く評価されます。このコードは堅牢にします。

+0

ここではテストするロジックはありません。何らかの理由で 'readline.Interface'をテストしますか? – Pavlo

+0

@Pavloこれはトレーニング目的のためのものです。基本的には、TDDベースのテストケースをいくつか書いて、readlineとfsの特定の機能が参加者によって確実に使用されるようにしたいと思います。私はコードを提供するのではなく、テストを提供します。参加者は、テストケースに合格するために上記の方法でコードを記述する必要があります。 – user2693135

答えて

2

モジュールでrequireのモジュールをテストしようとしているので、rewireのようなものを使用してrequireコールを「再配線」することができます。

var rewire = require("rewire"); 
var sinon = require("sinon"); 
var myModule = rewire("path/to/module"); 

describe("Test createInterface method of readline", function(err){ 
    it("should be called only once", function() { 
    var readlineStub = sinon.stub(); 
    myModule.__set__("readline", readlineStub); 
    myModule.convert(2016); 
    sinon.assert.calledOnce(spyCreateInterface); 
    }); 
}); 
関連する問題