Mat*_*nis 10 javascript node.js jasmine jasmine-node
我正在使用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});
}
});
};
Run Code Online (Sandbox Code Playgroud)
以下是我成功测试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();
});
});
});
Run Code Online (Sandbox Code Playgroud)
这很好用,但由于if块从未经过测试,因此我的分支覆盖率很低.我的问题是,如何强制错误块在测试中运行?我可以模拟一个设置为返回错误的响应,以便我可以测试是否记录了正确的警告并传回了正确的数据?
这取决于你的测试。如果您只想进行单元测试,那么间谍是最佳选择。您可以存根您的数据库响应。请注意,在这种情况下,不会调用数据库。这只是模拟的。
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)
// ...
Run Code Online (Sandbox Code Playgroud)
如果您想要进行功能/集成测试,您只需使用错误的数据来调用您的请求,例如数据库中不存在的玩家 ID。
request
.get('/api/players/i_am_no_player/summary')
.set('Content-Type', 'application/json')
.set('cookie', cookie)
.expect(500)
// ...
Run Code Online (Sandbox Code Playgroud)