为 javascript 中使用 jwt 令牌的方法编写单元测试
Writing unit tests for method that uses jwt token in javascript
我一直在尝试在 javascript 中为使用 jwt 令牌验证的方法编写单元测试。因此只有在令牌有效时才会获取结果。
我想模拟 jwt 令牌和 return 结果。有什么办法吗?我尝试使用 ava 测试框架、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.
模块在 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 令牌验证的方法编写单元测试。因此只有在令牌有效时才会获取结果。
我想模拟 jwt 令牌和 return 结果。有什么办法吗?我尝试使用 ava 测试框架、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.
模块在 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();
})