404错误,在WebComponent单元测试期间找不到html

时间:2019-08-12 21:07:02

标签: javascript unit-testing karma-runner chai

当我运行业力测试时,会导入一个HTML文件的javascript文件,我希望该html可用于测试。对于我来说,尚不清楚我是否正在尝试某种尚未准备好的业力,还是应该在开始测试之前以某种方式添加HTML文件。

用几句话来说,我应该怎么做才能对波纹管Web组件进行单元测试,该组件被分为两个文件(js和html)?也许有用的评论是,如果我误解了业力方面的错误(例如,它无法异步加载由javascript导入的文件)

控制台错误:

# npm run test

> skyscanner-openwc-graphql@0.0.0 test C:\_d\WSs\rapidapi-vanilla-webcomponents\skyscanner-openwc-graphql
> karma start --coverage


START:
12 08 2019 15:29:40.982:WARN [filelist]: Pattern "C:/_d/WSs/rapidapi-vanilla-webcomponents/skyscanner-openwc-graphql/__snapshots__/**/*.md" does not match any file.
12 08 2019 15:29:41.005:INFO [karma-server]: Karma v4.2.0 server started at http://0.0.0.0:9876/
12 08 2019 15:29:41.007:INFO [launcher]: Launching browsers ChromeHeadlessNoSandbox with concurrency unlimited
12 08 2019 15:29:41.013:INFO [launcher]: Starting browser ChromeHeadless
12 08 2019 15:29:42.172:INFO [HeadlessChrome 76.0.3809 (Windows 10.0.0)]: Connected on socket fPyJTkm8LvWTrPBoAAAA with id 27628633
12 08 2019 15:29:47.926:WARN [web-server]: 404: /src/skyscanner-flight-search/skyscanner-flight-search.html
  skyscanner flight search
    × show div
HeadlessChrome 76.0.3809 (Windows 10.0.0) skyscanner flight search show div FAILED
        TypeError: Cannot read property 'querySelector' of null
            at Context.querySelector (test/skyscanner-flight-search.test.js:10:23)

Finished in 0.102 secs / 0.022 secs @ 15:29:48 GMT-0300 (GMT-03:00)

SUMMARY:
√ 0 tests completed
× 1 test failed

FAILED TESTS:
  skyscanner flight search
    × show div
      HeadlessChrome 76.0.3809 (Windows 10.0.0)
    TypeError: Cannot read property 'querySelector' of null
        at Context.querySelector (test/skyscanner-flight-search.test.js:10:23)

Webcomponent,JavaScript文件(skyscanner-flight-search.js):

(async() => {
    const res = await fetch(
        "../src/skyscanner-flight-search/skyscanner-flight-search.html"
    );
    const textTemplate = await res.text();

    const HTMLTemplate = new DOMParser()
        .parseFromString(textTemplate, "text/html")
        .querySelector("template");

    class skyscannerFlightSearch extends HTMLElement {
        constructor() {
            super();
        }

        connectedCallback() {
            this.attachShadow({ mode: "open" });
            this.shadowRoot.appendChild(HTMLTemplate.content.cloneNode(true));

            const inputSessionKey = this.shadowRoot.getElementById("inputSessionKey");
            //const url = "http://localhost:8080/getsessionkey";
            const url = "https://rapid-api-to-learn.herokuapp.com/getsessionkey";

            fetch(url)
                .then(function(body) {
                    return body.text();
                })
                .then(function(data) {
                    inputSessionKey.value = data;
                    console.log(data);
                });
        }
    }

    window.customElements.define(
        "skyscanner-flight-search",
        skyscannerFlightSearch
    );
})();

Webcomponent,html文件(skyscanner-flight-search.html)

<template id="skyscanner-flight-search-template"
  ><div id="firstdiv"><input id="inputSessionKey" /></div
></template>

依赖性(只是相关性)

    "scripts": {
...
        "test": "karma start --coverage",
...

    },
    "dependencies": {
        "lit-html": "^1.0.0",
        "lit-element": "^2.0.1"
    },
    "devDependencies": {
        "es-dev-server": "^1.5.0",
        "@open-wc/eslint-config": "^1.0.0",
        "@open-wc/prettier-config": "^0.1.10",
        "husky": "^1.0.0",
        "lint-staged": "^8.0.0",
        "@open-wc/testing-karma": "^3.0.0",
        "webpack-merge": "^4.1.5",
        "@open-wc/testing-karma-bs": "^1.0.0",
        "@open-wc/testing": "^0.11.1",
        "@open-wc/demoing-storybook": "^0.3.0"
    },

karma.conf.js

const { createDefaultConfig } = require('@open-wc/testing-karma');
const merge = require('webpack-merge');

module.exports = config => {
    config.set(
        merge(createDefaultConfig(config), {
            files: [

                { pattern: config.grep ? config.grep : 'test/**/*-search.test.js', type: 'module' },
            ],

            esm: {
                nodeResolve: true,
            },
            // you can overwrite/extend the config further
        }),
    );
    return config;
};

1 个答案:

答案 0 :(得分:0)

感谢讨论https://github.com/open-wc/open-wc/issues/730,我找到了解决方案:

我必须做两件事才能对在两个文件中拆分的香草web组件进行单元测试:

我的webcomponent javascript

'
const htmlPath = new URL(
'./skyscanner-flight-search.html',
import.meta.url,
);
const res = await fetch(htmlPath);
...
'

我的单元测试

'
import { html, fixture, expect } from '@open-wc/testing';

import '../src/skyscanner-flight-search/skyscanner-flight-search.js';

describe('skyscanner flight search', () => {
it('show div', async() => {
const el = await fixture(html <skyscanner-flight-search></skyscanner-flight-search>);

    window.customElements.whenDefined('skyscanner-flight-search').then(() => {
        el.shadowRoot.querySelector('#firstdiv');
        expect(el).to.exist;
    })

});
});
'

可能我缺少有关Karma为了对JavaScript提取文本文件进行单元测试所花费的时间和步骤的一些基本概念。顺便说一句,以上方法解决了问题标题。

***根据讨论https://dev.to/bennypowers/lets-build-web-components-part-3-vanilla-components-4on3

编辑
import { html, fixture, expect } from '@open-wc/testing';

import '../src/skyscanner-flight-search/skyscanner-flight-search.js';

describe('skyscanner flight search', () => {
    it('show div', async() => {
        const el = await fixture(html `
      <skyscanner-flight-search></skyscanner-flight-search>
    `);
        await window.customElements.whenDefined('skyscanner-flight-search')
        expect(el.shadowRoot.querySelector('#firstdiv')).to.exist;

    });

    it('show input for session key', async() => {
        const el = await fixture(html `
      <skyscanner-flight-search></skyscanner-flight-search>
    `);
        await window.customElements.whenDefined('skyscanner-flight-search')
        expect(el.shadowRoot.querySelector('#inputSessionKey')).to.exist;
    });
});