2016-10-01 10 views
10

jasmine-nodeを使用してノード・サーバーのAPIエンドポイントの背後にあるコントローラ・ロジックをテストしています。ジャスミン・ノード・テストでエラー・ブランチを強制する方法

以下
var getSummary = function(req, res) { 
    var playerId = req.params.playerId; 

    db.players.getAccountSummary(playerId, function(err, summary) { 
    if (err) { 
     logger.warn('Error while retrieving summary for player %d.', playerId, err); 
     return res.status(500).json({ 
     message: err.message || 'Error while retrieving summary.', 
     success: false 
     }); 
    } else { 
     res.json({success: true, summary: summary}); 
    } 
    }); 
}; 

私は成功しelseブロックをテストする方法です:

describe('GET /api/players/:playerId/summary', function() { 
    it('should return an object summarizing the player account', function(done) { 
    request 
     .get('/api/players/' + playerId + '/summary') 
     .set('Content-Type', 'application/json') 
     .set('cookie', cookie) 
     .expect(200) 
     .expect('Content-Type', /json/) 
     .end(function(err, res) { 
     expect(err).toBeNull(err ? err.message : null); 
     expect(res.body.success).toBe(true); 
     expect(res.body.summary).toBeDefined(); 
     done(); 
     }); 
    }); 
}); 

これはうまく動作しますが、ifブロックがあるとして貧しい分岐カバレッジを私に残しここでは、このコントローラロジックは、一般的に次のようになりますテストされていません。私の質問は、テストでエラーブロックを実行するにはどうすればいいですか?正しい警告が記録され、正しいデータが返されたことをテストできるように、エラーを返すように設定された応答を嘲笑することはできますか?

+0

参照http://stackoverflow.com/questions/8408033/use-jasmine-to-stub-js-callbacks-based-on-argument-([使用ジャスミンは、引数の値に基づいて、JSコールバックをスタブに]値)。あなたがしようとしているトリックは、モックを作成することです。 –

答えて

1

これはテストによって異なります。ユニットテストだけをしたいのであれば、スパイが行く方法です。 db応答をスタブすることができます。この場合、データベースは呼び出されないことに注意してください。ちょうどシミュレートされています。

const db = require('./yourDbModel'); 
spyOn(db.players, 'getAccountSummary').and.callFake(function(id, cb) { 
    cb(new Error('database error'); 
}); 

request 
    .get('/api/players/' + playerId + '/summary') 
    .set('Content-Type', 'application/json') 
    .set('cookie', cookie) 
    .expect(500) 
    // ... 

あなたは、機能/統合テストをしたい場合は、例えば、単に間違ったデータを使用してデータベースに存在しないプレイヤーIDをあなたの要求を呼び出す必要があります。

request 
    .get('/api/players/i_am_no_player/summary') 
    .set('Content-Type', 'application/json') 
    .set('cookie', cookie) 
    .expect(500) 
    // ... 
関連する問題