gpt4 book ai didi

Cypress :如何在 `cy.task` 中等待 `cy.intercept`

转载 作者:行者123 更新时间:2023-12-04 13:53:33 24 4
gpt4 key购买 nike

我有一种情况,我想在拦截中生成 JWT token 并将其返回到它的主体中。
问题在于,在该 token 的有效载荷中,应该使用另一个拦截的值。
这意味着我只能在拦截期间生成 token 。

const code = '1234567890ABCDEFGH';
let accessTokenSource, idTokenSource, accessToken, idToken;
cy.fixture('access.token.json').then((source) => (accessTokenSource = source));
cy.fixture('id.token.json').then((source) => (idTokenSource = source));
cy.intercept('https://****/authorize', (req) => {
const url = new URL(req.url);

idTokenSource.claims.nonce = url.searchParams.get('nonce');

req.redirect(`${Cypress.config().baseUrl}?code=${code}&state=${url.searchParams.get('state')}`);
});
cy.intercept('https://****/oauth/token', (req) => {
cy.task('generateToken', accessTokenSource).then((token) => (accessToken = token));
cy.task('generateToken', idTokenSource).then((token) => (idToken = token));

console.log('accessToken', accessToken);
console.log('idToken', idToken);

req.reply({
body: {
access_token: accessToken,
expires_in: 86400,
id_token: idToken,
scope: 'openid profile email',
token_type: 'Bearer',
},
headers: {
'content-type': 'application/json',
},
});
});
正如您可能已经想到的那样, accessTokenidToken 是空的。
我应该在这里更改什么以等待 generateToken 任务完成以在 req.reply 中使用它?
附言我已经尝试过这个,但它不起作用:
cy.task('generateToken', accessTokenSource).as('generateAccessToken');
cy.task('generateToken', idTokenSource).as('generateIdToken');

cy.wait('@generateAccessToken').then((token) => (accessToken = token));
cy.wait('@generateIdToken').then((token) => (idToken = token));

console.log('accessToken', accessToken);
console.log('idToken', idToken);
附言2。当我将 generateToken 放在测试的 it() 中时,ojit_code 工作得很好。

最佳答案

我已经通过不再使用插件而是直接执行 sign 函数来创建一个解决方法。
在 cypress 测试文件之上:

import jwt from 'jsonwebtoken';

const generateToken = function (privateKey, options) {
return jwt.sign(options.claims, privateKey, { algorithm: 'RS256', expiresIn: options.expires, issuer: options.issuer });
};
测试开始:
let authCode, privateKey, accessTokenSource, idTokenSource, accessToken, idToken;

authCode = Cypress.env('authCode');
cy.readFile(Cypress.env('jwtPrivateKey')).then((key) => (privateKey = key));
cy.fixture('access.token.json').then((source) => (accessTokenSource = source));
cy.fixture('id.token.json').then((source) => (idTokenSource = source));
截距:
cy.intercept('https://***/oauth/token', (req) => {
const params = new URLSearchParams(req.body);
expect(params.get('code')).to.equal(authCode);

accessToken = generateToken(privateKey, accessTokenSource);
idToken = generateToken(privateKey, idTokenSource);

req.reply({
body: {
access_token: accessToken,
expires_in: 86400,
id_token: idToken,
scope: 'openid profile email',
token_type: 'Bearer',
},
headers: {
'content-type': 'application/json',
},
});
});

关于 Cypress :如何在 `cy.task` 中等待 `cy.intercept`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66656659/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com