Как добавить рекурсивную функцию проверки ответа xhr в скрипте testcafe? - PullRequest
6 голосов
/ 09 мая 2019

Я пытаюсь написать тестовую загрузку работ, которая требует проверить, имеет ли ответ xhr статус ГОТОВ. Я создал клиентскую функцию в TestCafe, используя обещания, но она не работает в случае рекурсии.

Как мне исправить мой код, чтобы справиться с этой ситуацией?

P.S. много извинений за вопросы новичков, я только начал свой путь в автоматизации тестирования.


fixture`Download report works`


test
    .requestHooks(logger)//connected a request hook, will wait for logger request 
    ('I should be able to download PDF report from header of the page', async t => {
        //recursively check if response status is READY, and then go to assertions

        const waitForDownloadResponseStatus = ClientFunction((log) => {
            return new Promise((resolve,rejects)=>{
                const waitForStatus=()=>{

                        const arrayFromResponse = JSON.parse(log.response.body);
                        const responseStatus = arrayFromResponse.status;
                        if (responseStatus == 'READY')
                        {
                            resolve(responseStatus);
                        } 
                        else {
                            waitForStatus();
                        }
                    }
                waitForStatus();
                })
        });
        //page objects
        const reportTableRaw = Selector('div.contentcontainer').find('a').withText('April 2019').nth(0);
        const downloadPdfButton = Selector('a.sr-button.sr-methodbutton.btn-export').withText('PDF');
        //actions.

        await t
                .navigateTo(url)
                .useRole(admin)       
                .click(reportTableRaw)//went to customise your report layout
                .click(downloadPdfButton)
                .expect(logger.contains(record => record.response.statusCode === 200))
                .ok();//checked if there is something in logger
        const logResponse = logger.requests[0];

                // const arrayFromResponse = JSON.parse(logResponse.response.body);
                // const responseStatus = arrayFromResponse.status;

        console.log(logger.requests);
        await waitForDownloadResponseStatus(logResponse).then((resp)=>{
            console.log(resp);
            t.expect(resp).eql('READY');
        });     


    });

1 Ответ

5 голосов
/ 13 мая 2019

Когда вы передаете объект в качестве аргумента или зависимости клиентской функции, он получит копию переданного объекта.Таким образом, он не сможет обнаружить какие-либо изменения, сделанные внешним кодом.В этом конкретном случае функция waitForStatus не достигнет своего состояния завершения, потому что она не может обнаружить изменения в объекте log, сделанные внешней перехватчиком запросов.Это означает, что эта функция будет работать бесконечно, пока она не будет использовать всю доступную память стека.После этого произойдет ошибка с переполнением стека.

Чтобы избежать этой ситуации, вы можете проверить, что ответ имеет статус READY, если вы измените аргумент предиката функции contains.Взгляните на следующий код:

.expect(logger.contains(record => record.response.statusCode === 200 &&
                                  JSON.parse(record.response.body).status === 'READY'))
.ok({ timeout: 5000 });

Также вы можете использовать опцию timeout.Это время (в миллисекундах), в течение которого утверждение может пройти, прежде чем тест не пройден.

...