2017-02-15 7 views
0

Я пытаюсь запустить тест, где хочу проверить, что мой вспомогательный файл работает правильно, и если у меня есть истекший токен, я получаю обратную отдачу и не могу продолжить.useFakeTimers mocha chai sinon - не правильный результат при тестировании

У меня такое чувство, что я могу только подделать время непосредственно в тесте, а не за его пределами. Дело в том, что я не хочу копировать функцию 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(); 
     }); 
    }); 
    }); 
+0

ли нижеприведенную работу ответа для вас? – anoop

ответ

1

JWT проверяет истечение и выбрасывает ошибку самостоятельно. Поэтому нам просто нужно утверждать из сообщения об ошибке. Я внесла некоторые изменения в код и заставил его работать.

Я испытал это, как показано ниже, (фрагменты кода)

const moment = require('moment'); 
const jwt = require('jsonwebtoken'); 

const secret = 'abczzxczxczxc'; 

function encodeToken(user) { 
    const payload = { 
    exp: moment().add(1, 'hours').unix(), // expires the token in an hour 
    iat: moment().unix(), 
    sub: user.id 
    }; 

    const token = jwt.sign(payload, secret); 
    return token; 
} 

function decodeToken(token, callback) { 
    jwt.verify(token, secret, function(err, decoded) { 
    callback(err, 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('./'); 

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 
    }); 
    token.should.exist; 
    token.should.be.a('string'); 
    clock.tick(36001000000); 
    localAuth.decodeToken(token, (err, res) => { 
     should.exist(err); 
     err.message.should.eql('jwt expired'); 
     done(); 
    }); 
    }); 
}); 

Выходные

➜ faketimer ./node_modules/mocha/bin/mocha index_test.js

decodeToken()✓ должен возвращать декодированную полезную нагрузку

1 прохождение (17ms)

+0

Это было именно то, что мне нужно. Я не знал, что JWT проверяет истечение самостоятельно, поэтому я очень благодарен за объяснение :) И извинения за задержку ... в течение нескольких дней болел. Еще раз спасибо! –

+0

@ThomasGorczynski Не беспокойтесь. Рад помочь.. – anoop

Смежные вопросы