Jest - DOM, связанный и через файлы JS Unit Testing - PullRequest
0 голосов
/ 13 сентября 2018

Я использую Jest для модульного тестирования. Добавлены jest-puppeteer и rewire . Проблема в том, что когда я пытаюсь вызвать sayHello(), используя приведенный ниже код, переменная $button не определена и выдает ошибку в main.js. И если я позвоню someFunctionFromAnotherJS(), это тоже ошибка. В любом случае это вернет ошибку, так как я не знаю, как писать модульные тесты для DOM, связанных и для всех файлов JS. Обратите внимание, что мне также нужно использовать все глобальные переменные, загруженные в браузер, в файлах JS.

Пожалуйста, посмотрите на приведенный ниже код и скажите, как мне этого добиться.

Тесты / main.test.js

var rewire = require('rewire');
var main = rewire('../main');
var sayHello = main.__get__('sayHello');

describe('Testing', () => {
  beforeAll(async () => {
    await page.goto('https://***.**.com/**');
  });

  it('should test page', async () => {
    await page.type('#lid', '*****@gmail.com');
    await page.type('#pwd', '*****');
    await page.click('#signin_submit');
    var dimensions = await page.evaluate(() => {
      return {
        width: document.documentElement.clientWidth,
        height: document.documentElement.clientHeight,
        deviceScaleFactor: window.devicePixelRatio
      };
    });

    await page.goto('https://***.**.com/**', {timeout: 30000, waitUntil: 'load'});
    await page.goto('https://***.**.com/**', {timeout: 30000, waitUntil: 'load'});
    var evaluatedPage = await page.evaluate(() => {
      return {
        isFreeUser: window.isFreeUser
      };
    });
    await page.screenshot({path: 'screenshot.png'});
    console.log('Evaluated Page:', evaluatedPage);
    expect(evaluatedPage.isFreeUser).to.equal(false);

    sayHello();
  });
});

main.js

var $button = $('#myButton');

function sayHello() {
    $button.text('Hello!');
    return someFunctionFromAnotherJS();
}

another.js

function someFunctionFromAnotherJS() {
    return 'hello';
}

Заранее спасибо.

1 Ответ

0 голосов
/ 14 сентября 2018

Чтобы устранить эту проблему, вы можете console.log (sayHello) и посмотреть, что на самом деле там. Если сама sayhello - правильная функция, тогда продолжайте,

Кажется, main.js - это скрипт, который должен запускаться в браузере. Если это так, вы должны запустить его в браузере, а не в контексте nodeJS.

Вместо sayHello();, вы можете попробовать,

await page.evaluate(sayHello)

Таким образом, он будет выполняться в контексте браузера.

РЕДАКТИРОВАТЬ: jest-puppeteer - это всего лишь продолжение шутки, помогающей вам тестировать различные маленькие кусочки. Вы можете написать тесты отдельно. Но если вы хотите запустить и протестировать функции DOM, вам нужно использовать что-то, что может запустить эту функцию DOM. Это факт.

Я не уверен, почему вы пытаетесь запустить код jQuery (который зависит от браузеров window и document) в среде nodeJS.

Смотрите здесь , вам нужно как-то эмулировать DOM. Так что Puppeteer, jsdom и другие помогут вам в этом. Ссылочный ответ:

Если вы действительно хотите держать все отдельно и не хотите использовать puppeteer (что я действительно не понимаю, зачем вам это нужно), то вы можете попробовать несколько комбинаций следования, чтобы увидеть, что лучше всего подходит для вы, но помните, что вы пытаетесь заново изобрести то, что уже есть,

...