为在JavaScript中使用jwt令牌的方法编写单元测试

Joh*_*uel 3 javascript unit-testing jwt sinon ava

我一直在尝试为使用jwt令牌验证的方法在javascript中编写单元测试。因此,仅当令牌有效时才获取结果。

我想模拟jwt令牌并返回结果。有什么办法吗?我尝试使用av​​a测试框架,mock require,sinon,但我做不到。

有什么想法吗 ?

码:

I am trying to mock jwt.verify    

**unit test:**

const promiseFn = Promise.resolve({ success: 'Token is valid' });

mock('jsonwebtoken', {
        verify: function () {         
            return promiseFn;   
        }
});

const jwt = require('jsonwebtoken');

const data =  jwt.verify(testToken,'testSecret');

console.log(data)


**Error :**

ERROR
    {"name":"JsonWebTokenError","message":"invalid token"} 


So the issue here is that, its actually verifying the token but not invoking the mock.
Run Code Online (Sandbox Code Playgroud)

Ant*_*ich 7

模块是Node.js中的单例。因此,如果您在测试中需要“ jwt”,然后在业务逻辑中需要它,那么它将是同一对象。

因此,您几乎可以在测试中需要“ jwt”模块,然后模拟该verify方法。

同样,重要restore的是在测试完成后不要忘记模拟。

这是您想要完成的最小工作示例(使用ava和sinon):

const test = require('ava');
const sinon = require('sinon');
const jwt = require('jsonwebtoken');

let stub;

test.before(t => {
    stub = sinon.stub(jwt, 'verify').callsFake(() => {
        return Promise.resolve({success: 'Token is valid'});
    });
})

test('should return success', async t => {
    const testToken = 'test';
    const testSecret = 'test secret';

    const result = await jwt.verify(testToken, testSecret);

    console.log(result);

    t.is(result.success, 'Token is valid');
});

test.after('cleanup', t => {
    stub.restore();
})
Run Code Online (Sandbox Code Playgroud)