#node.js #testing #automated-tests #e2e-testing #testcafe
#node.js #тестирование #автоматизированные тесты #e2e-тестирование #testcafe
Вопрос:
Я использую макет запроса и получаю данные json из внешнего файла:
import { RequestMock } from 'testcafe';
const mockData = require('abc.json');
var mock = RequestMock()
.onRequestTo('https://api.mycorp.com/users/id/135865')
.respond(mockData);
fixture `My fixture`
.page `https://mycorp.com`
.requestHooks(mock);
test('My test', async t => { /* ... */ });
Теперь я пытаюсь импортировать фиктивные данные из моей системы хранения.
Допустим, команда CLI для извлечения abc.json в текущий каталог является:
mysystem pull abc.json
Я ищу код для этого. Я пытался использовать child_process, но моей командной строке требуется несколько секунд для извлечения abc.json, а тем временем выполняется код testcafe.
import { RequestMock } from 'testcafe';
const getData = require('child_process').exec;
getData('mysystem pull abc.json', (e, stdout, stderr)=> {
if (e instanceof Error) {
console.error(e);
throw e;
}
console.log('stdout ', stdout);
console.log('stderr ', stderr);
});
const mockData = require('./abc.json');
var mock = RequestMock()
.onRequestTo('https://api.mycorp.com/users/id/135865')
.respond(mockData);
fixture `My fixture`
.page `https://mycorp.com`
.requestHooks(mock);
test('My test', async t => { /* ... */ });
Я получаю сообщение об ошибке, которое
mock is not defined.
Я ясно вижу, что мой json загружается после завершения выполнения testcafe.
Итак, мне нужен способ, чтобы сначала завершалась команда командной оболочки, а затем выполнялся код testcafe.
Ответ №1:
TestCafe позволяет создавать асинхронные функции для макетирования ваших данных. Взгляните на следующую статью: https://devexpress.github.io/testcafe/documentation/reference/test-api/requestmock/respond.html#a-custom-response-function .
Вы можете изменить свою getData
функцию, чтобы возвращать обещание следующим образом:
function getData () {
return new Promise(resolve => {
exec('your-api', (error, stdout, stderr) => {
resolve(result);
});
});
}
В этом случае вы можете изменить свой RequestMock так, чтобы он работал асинхронно:
var mock = RequestMock()
.onRequestTo('your-api')
.respond(async (req, res) => {
const body = await getData();
res.setBody(body);
});