如何强制jasmine-nodetesting中的错误分支

我正在用jasmine-nodetesting节点服务器中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}); } }); }; 

以下是我如何成功testingelse块:

 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块从未被testing,我的分支覆盖率就会很差。 我的问题是,如何强制错误块在testing中运行? 我可以嘲笑一个设置为返回错误的响应,以便我可以testing正确的警告是否logging,并传回正确的数据?

这取决于你的testing。 如果你只想unit testing,间谍是要走的路。 你可以只存根你的数据库响应。 请注意,在这种情况下,数据库不会被调用。 这只是模拟。

 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) // ... 

如果你想要function/集成testing,你只需要用错误的数据来调用你的请求,例如你的数据库中不存在的玩家ID。

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