我正在尝试运行一个测试,我想验证我的帮助文件是否正确运行,如果我有一个过期的令牌,我会收到一个错误回扣并且无法继续。
我有一种感觉,我只能在测试中直接伪造时间,而不是在它之外。问题是,我不想在我的测试中复制 jwt.verify 函数,因为如果我更改实际帮助文件中的代码,那将达不到目的。对这个有帮助吗?
我在用诗乃假装时间。如果我测试一下我现在和时钟滴答后的时间,我确实得到了正确的结果。但由于某种原因,这不适用于另一个文件中的函数。
我的local.js文件
const moment = require('moment');
const jwt = require('jsonwebtoken');
const secret = process.env.TOKEN_SECRET;
function encodeToken(user) {
const playload = {
exp: moment().add(1, 'hours').unix(), // expires the token in an hour
iat: moment().unix(),
sub: user.id
};
return jwt.sign(playload, secret);
}
function decodeToken(token, callback) {
const payload = jwt.verify(token, secret, function (err, decoded) {
const now = moment().unix();
console.log('tim: ' + decoded.exp); //just to see
console.log('now: ' + now); // just to see
if (now > decoded.exp) {
callback('Token has expired.');
}
callback(null, decoded);
});
}
module.exports = {
encodeToken,
decodeToken
};
和我的测试文件:
process.env.NODE_ENV = 'test';
const chai = require('chai');
const should = chai.should();
const sinon = require('sinon');
const localAuth = require('../../src/server/auth/local');
describe('decodeToken()', function () {
var clock;
beforeEach(function () {
clock = sinon.useFakeTimers();
});
afterEach(function () {
clock.restore();
});
it('should return a decoded payload', function (done) {
const token = localAuth.encodeToken({
id: 1
});
should.exist(token);
token.should.be.a('string');
clock.tick(36001000000);
localAuth.decodeToken(token, (err, res) => {
should.exist(err);
res.should.eql('Token has expired.');
done();
});
});
});