Как импортировать поддельные данные из командной оболочки

#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);
    });