#javascript #function #testing #automated-tests #testcafe
Вопрос:
Я пытался заставить функцию(см. Ниже) работать. Если я вызову эту функцию в своем тесте следующим образом:
test.meta({ CID: 'C67', type: TestType.Critical }).timeouts({
pageLoadTimeout: 5000,})(
'Test to GetData',
async (t:TestController) => {
// When
const result = getData.getFinalData()
const finalResult = JSON.stringify(result)
console.log(finalResult)
})
В журнале я получаю пустой результат:
Раскрытие дела
{}
Но если я сделаю console.log(данные) внутри функции, я получу правильные данные. Поэтому я просто хочу знать, как получить эти данные. Как мне понадобится позже, чтобы использовать его для моего теста.
Я собирался использовать его вот так:
const randomCaseId = конечный результат[getRandomInt(1000)].CaseID.toString()
public async getFinalData () {
fetch(TOKEN_API, {
method: 'post',
body: new URLSearchParams(details),
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
})
.then((res: { json: () => any; }) => res.json())
.then((json: any) => {
const token = (json.accessToken.toString())
console.log(token),
fetch(DATA_API, {
method: 'GET',
headers: { 'Content-Type': 'application/json' ,'authorization': `Bearer ${token}`}})
.then((res: { json: () => any; }) => res.json())
.then((json:any)=>{
const data = JSON.stringify(json)
return data;
}
)
})}
Комментарии:
1. почему вы строчите это
data
? JSON гораздо менее полезен, чем объект. А затем вы пытаетесь упорядочить JSON, который, как вы предполагаете, будет возвращен. Не уверен, что вы понимаете JSON …2. так
getFinalData
как ничего не возвращает, иasync
вы никогда не получите ничего, кроме обещания, которое будет выполненоundefined
при вызове этой функции. 1. ПочемуgetFinalData
помеченоasync
, так как вы никогда не используетеawait
. 2. чтобы получить доступ к результату вызова функции, вам потребуется либоawait
она, либо использовать.then
результат3. используйте
const result = await getData.getFinalData()
вasync (t:TestController) => {
— но убедитесьgetFinalData
, что на самом деле возвращает то, что вам нужно
Ответ №1:
так getFinalData
как ничего не возвращает, и async
вы никогда не получите ничего, кроме обещания, которое будет выполнено undefined
при вызове этой функции.
Почему getFinalData
помечено async
, так как вы никогда не используете await
. Я бы использовал async/await для простого кода, а не для .затем цепочку, которую вы используете
Чтобы получить доступ к результату вызова этой функции, вам потребуется либо await
использовать ее, либо использовать .then
результат — поскольку функция вызова является async
, используйте await
Перепишите свой код, как
test.meta({ CID: 'C67', type: TestType.Critical })
.timeouts({pageLoadTimeout: 5000,})('Test to GetData', async (t:TestController) => {
// When
const finalResult = await getData.getFinalData();
console.log(finalResult)
})
и
public async getFinalData () {
const tokenres = await fetch(TOKEN_API, {
method: 'post',
body: new URLSearchParams(details),
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
});
const tokendata = await tokenres.json();
const token = tokendata.accessToken.toString();
console.log(token);
const res = await fetch(DATA_API, {
method: 'GET',
headers: { 'Content-Type': 'application/json' ,'authorization': `Bearer ${token}`}
});
// ** see note below, don't do the next two lines like this
const data = await res.json();
return data;
}
Этот код правильно использует async/await и не строит данные в JSON дважды!
Кроме того, обратите внимание
const data = await res.json();
return data;
может быть одна строка
return res.json();
Потому что именно так работают обещания
Ответ №2:
Здесь есть несколько проблем:
- Когда вы возвращаете значение внутри функции , которое вы передали
then
, оно не будет возвращено как значение внешней функции getFinalData
этоasync
так, чтобы вернуть обещаниеgetFinalData
возвращает обещание, но вы никогда не передаете значение в качестве разрешенных данных
Вы можете использовать следующий код, который будет ждать ответа:
test.meta({
CID: 'C67',
type: TestType.Critical
}).timeouts({
pageLoadTimeout: 5000,
})(
'Test to GetData',
async (t: TestController) => {
// When
const result = await getData.getFinalData()
const finalResult = JSON.stringify(result)
console.log(finalResult)
})
А также обязательно дождитесь выборки и верните разрешенное значение:
public async getFinalData() {
const res = await fetch(TOKEN_API, {
method: 'post',
body: new URLSearchParams(details),
headers: {
'Content-Type': 'application/x-www-form-urlencoded'
},
})
const json = await res.json();
const token = (json.accessToken.toString())
console.log(token);
const response = await fetch(DATA_API, {
method: 'GET',
headers: {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
}
});
return response.json();
}
Комментарии:
1. честно говоря, я не думаю, что какой-либо из JSON.stringify требуется … с помощью этого кода, если бы результатом был ОБЪЕКТ
{hello: "world"}
, то конечным результатом был бы результат … подождите этого"{\"hello\":\"world\"}"
— даже если первоначальный результат был жаломworld
, конечный результат будет"\"world\""
2. @Браво верно, я совсем забыл об этом! Обновленный
3. ещё один…
return await response.json();
может бытьreturn response.json();
, из-за того, как работают обещания4. @Браво, я знаю, но так немного чище!
5. Ребята, большое вам спасибо за помощь. Пожалуйста, поймите, что я не разработчик, а только учусь. Я инженер по автоматизации, который просто пытается автоматизировать наше веб-приложение.