我正在使用茉莉花节点测试我节点服务器中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}); } }); };
下面是我如何成功测试其他块:
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(); }); }); });
这很好,但是我的分支覆盖不好,因为如果块没有被测试.我的问题是,如何强制错误块运行在测试中?我可以模拟一个设置为返回错误的响应,以便我可以测试正确的警告是否被记录,正确的数据被传回?
解决方法
这取决于你的测试.如果你只想进行单元测试,间谍是要走的路.
您只需存储数据库响应即可.请注意,在这种情况下,数据库不会被调用.它只是模拟.
您只需存储数据库响应即可.请注意,在这种情况下,数据库不会被调用.它只是模拟.
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',cookie) .expect(500) // ...