Веб-компонент / HtmlElement: модульное тестирование - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь протестировать веб-компонент.Вот моя структура проекта:

├── package.json
├── src
│   ├── app.js
│   └── index.html
└── test
    └── hello-world-test.html

Вот мой рабочий код:

class HelloWorld extends HTMLElement {
    connectedCallback () {
      this.innerHTML = 'Hello, World!'
    }
}
customElements.define('hello-world', HelloWorld);
<!doctype html>
<html>

<head>
    <meta charset="utf-8">
    <script src="app.js"></script>
</head>

<body>
    <hello-world></hello-world>
</body>

</html>

Я пытаюсь протестировать этот веб-компонент с помощью web-component-tester.Я установил утилиту глобально:

npm install -g web-component-tester

Я объявил ее в файле package.json:

"devDependencies": {
    "web-component-tester": "^6.9.0"
}

, затем я записал свой тест в папку test и сохранил его вhello-world-test.html:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../node_modules/web-component-tester/browser.js"></script>
    <script src="app.js"></script>
</head>
<body>
    <test-fixture id="hello-world-fixture">
            <hello-world></hello-world>
    </test-fixture>
    <script>
        suite('<hello-world>', function(){
            let component = document.querySelector('hello-world');

            test('contains hello world string ?', () => {
                let index = component.innerText.indexOf('Hello');
                assert.isAtLeast(index, 0);
            });
        });
    </script>
</body>
</html>

Наконец, я набрал:

wct --npm

Затем получил в Chrome следующую ошибку:

Here is the result in Chrome

Чего мне не хватает, чтобы правильно запустить тест?Единственные приличные материалы, которые я нашел, это этот и этот , но они устарели.

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Ответ Закарии хорош, но я предлагаю отказаться от wct-browser-legacy в пользу wct-mocha, так как он легче и не имеет устаревших зависимостей, таких как старая версия lodash, sinon и т. Д.

См. README для получения полной информации: https://www.npmjs.com/package/wct-mocha

tl; dr версия:

$ npm rm --save wct-browser-legacy
$ npm install --save-dev \
  @webcomponents/webcomponentsjs \
  @polymer/test-fixture \
  wct-mocha \
  mocha \
  chai

Вы не должны нуждаться в , чтобы указать его,но если у вас есть файл wct.conf.js, вы должны изменить существующую запись wctPackageName на:

wctPackageName: "wct-mocha"

Ваш HTML должен немного измениться, и вы должны убедиться, что mocha является прямой зависимостью, так как wct-Мокко не будет автоматически загружаться.Вам также необходимо сделать это с chai, если вы используете утверждения chai, и @polymer/test-fixture, если вы используете их.

<head>
  <meta charset="utf-8">
  <script src="../node_modules/@webcomponents/webcomponentsjs/webcomponents-loader.js"></script> 
  <script src="../node_modules/mocha/mocha.js"></script> 
  <script src="../node_modules/chai/chai.js"></script> 
  <script src="../node_modules/@polymer/test-fixture/test-fixture.js"></script> 
  <script src="../node_modules/wct-mocha/wct-mocha.js"></script> 
</head>
0 голосов
/ 25 ноября 2018

Есть много ошибок:

  • Во-первых, пожалуйста, прочитайте всю документацию, так как в последнем абзаце ясно, что для тех, кто использует npm, вам нужна дополнительная зависимостьчерез wctPackageName:

Компоненты, которые хотят поддерживать установку на основе npm, должны включать wct-browser-legacy в свои devDependencies, то есть пакет, который содержит только клиентский JavaScriptнеобходимо для выполнения тестов WCT в среде на основе npm.WCT попытается определить, какой пакет предоставляет код на стороне клиента, проверив совместимые пакеты в следующем порядке предпочтений: wct-mocha, wct-browser-legacy и web-component-tester.Если вы хотите указать, какой пакет предоставляет код на стороне клиента WCT, используйте флаг --wct-package-name или параметр wctPackageName в wct.conf.json с именем пакета npm.

вам нужно будет добавить wct-browser-legacy в ваш devDependencies

  • Предоставляя структуру вашего проекта, вы включаете app.js, как если бы он был на том же уровне.Это должно быть ../src/app.js.
  • Вы должны добавить type="module" к этому импорту
  • Вы объявили фиксатор, но не извлекли из него прибыль через функцию fixture

Если бы мне пришлось исправить ваш код:

  • Команда должна быть wct --npm -wct-package-name=wct-browser-legacy.Или даже лучше создать файл wct.conf.js со следующей информацией:

module.exports = {
    npm:true,
    verbose: true,
    plugins: {
        local: {
            browsers: ["chrome"]
        }
    },
    wctPackageName: "wct-browser-legacy"
};
  • Ваш тест должен быть изменен следующим образом:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <script src="../node_modules/web-component-tester/browser.js"></script>
    <script src="../src/app.js"></script>
</head>
<body>
    <test-fixture id="helloWorldFixture">
        <template>
            <hello-world>
            </hello-world>
        </template>
    </test-fixture>
    <script>
        suite('<hello-world>', () => {
            let component;
            setup(() => {
                component = fixture('helloWorldFixture');
            });

            test('contains hello world string ?', () => {
                let index = component.innerText.indexOf('Hello');
                assert.isAtLeast(index, 0);
            });
        });
    </script>
</body>
</html>

Обратите внимание, что я использовал идентификатор прибора и поместил инициализацию компонента в функцию setup.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...