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

Posted

技术标签:

【中文标题】为在 javascript 中使用 jwt 令牌的方法编写单元测试【英文标题】:Writing unit tests for method that uses jwt token in javascript 【发布时间】:2018-07-29 10:34:00 【问题描述】:

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

我想模拟 jwt 令牌并返回结果。有什么办法吗?我尝试使用 ava 测试框架、模拟 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.

【问题讨论】:

您介意提供一些您实际尝试执行此操作的代码吗?还有最后出了什么问题。所以我们可以修复并帮助您。 【参考方案1】:

模块是 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();
)

【讨论】:

以上是关于为在 javascript 中使用 jwt 令牌的方法编写单元测试的主要内容,如果未能解决你的问题,请参考以下文章

ADAL使用AcquireTokenAsync和现有JWT令牌续订令牌

Nodejs jwt 令牌永不过期

由于 JWT 令牌较大,超出了 Javascript 设置的 cookie 最大大小

是否可以在 Php 中加密 JWT 令牌并在 Javascript 中解密?

如何在前端的 Javascript Ajax API 调用中隐藏我的 JWT 令牌?

使用 Http 和 Secure 将 Jwt 令牌存储在 Cookie 中,而不是 Javascript 中的 LocalStorage