Vue.js - элемент ввода модульного тестирования

Я пытаюсь включить Vue.js в существующее приложение ASP.Net MVC.

Приложение выполняет полностраничное обновление и должно работать с CMS, поэтому подход, который я выбрал, - это написать отдельную "запись" Vue для каждой страницы, для которой требуется JavaScript (я не использую какие-либо компоненты Vue, потому что они не используют хорошо работать с нашей CMS).

У меня это работает, но теперь я хочу провести модульное тестирование своего кода Vue. Проблема в том, что все примеры модульного тестирования включают компоненты Vue.

Я пытаюсь проверить это с помощью jsdom, загрузив скомпилированный файл JavaScript. Тем не менее, JavaScript не выполняется.

Я понимаю, что это скорее интеграционный тест, чем модульный тест, поэтому, если у кого-то есть предложения о том, как тестировать модуль, я был бы признателен за это. В противном случае, некоторая помощь о том, как получить jsdom загрузить JavaScript поможет.

Код Vue компилируется через Webpack в файл с именем app.js, который находится в каталоге Scripts. Файл package.json находится в корневом каталоге.

Код Vue (машинопись)

import Vue from 'vue';

class TestTableInput {
    constructor(public value1: string, public value2: string) { }
}

const rows: TestTableInput[] = [];

const TestTable = new Vue({
    el: '#test-table',

    data: {
        rows: rows,
        isLoaded: false
    },

    methods: {
        setRows(json: any) {
            if (this.isLoaded) return;
            if (!json) return;

            this.rows = json as TestTableInput[];
            this.isLoaded = true;
        },

        addRow(): void {
            this.rows.push(new TestTableInput('new', 'values'));
        },

        deleteRow(rowIndex: number): void {
            this.rows.splice(rowIndex, 1);
        }
    }
});

Тестовый код (Jest и TypeScript)

import { JSDOM } from 'jsdom';

describe('TestTable', () => {
    it('Table Has Correct Number Of Rows', () => {
        const dom = new JSDOM(`
            <!DOCTYPE html>
            <html>
            <body>
                <div id="test-table" :rows="setRows([{'value1': '1.1', 'value2': '1.2'}, {'value1': '2.1', 'value2': '2.2'}])">
                    <table>
                        <tbody>
                            <tr v-for="(item, index) in rows">
                                <td>{{item.value1}}</td>
                                <td>{{item.value2}}</td>
                                <td>
                                    <button type="button" v-on:click="deleteRow(index)">
                                        Delete
                                    </button>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                    <button id="add" type="button" v-on:click="addRow()">
                        Add
                    </button>
                </div>
                <script src="Scripts/app.js"></script>
            </body>
            </html>
        `, { runScripts: 'dangerously'});

        dom.window.document.addEventListener('ready', () => {
            const rows = dom.window.document.getElementsByTagName('tr');
            expect(rows.length).toBe(2);
        });
    });
});

Тестовый вывод

console.error node_modules\jsdom\lib\jsdom\virtual-console.js:29
  Error: Uncaught [Error: expect(received).toBe(expected) // Object.is equality

  Expected value to be:
    2
  Received:
    1]
      at reportException (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\helpers\runtime-script-errors.js:66:24)
      at invokeEventListeners (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\events\EventTarget-impl.js:209:9)
      at EventTargetImpl._dispatch (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\events\EventTarget-impl.js:119:9)
      at EventTargetImpl.dispatchEvent (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\events\EventTarget-impl.js:82:17)
      at Window.dispatchEvent (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\generated\EventTarget.js:157:21)
      at Window.process.nextTick (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\browser\Window.js:598:14)
      at _combinedTickCallback (internal/process/next_tick.js:131:7)
      at process._tickCallback (internal/process/next_tick.js:180:9) { Error: expect(received).toBe(expected) // Object.is equality

  Expected value to be:
    2
  Received:
    1
      at C:\src\LgiaWeb\src\Project\Public\code\ClientAppTests\test\test-table.spec.ts:37:33
      at invokeEventListeners (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\events\EventTarget-impl.js:193:27)
      at EventTargetImpl._dispatch (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\events\EventTarget-impl.js:119:9)
      at EventTargetImpl.dispatchEvent (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\events\EventTarget-impl.js:82:17)
      at Window.dispatchEvent (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\living\generated\EventTarget.js:157:21)
      at Window.process.nextTick (C:\src\LgiaWeb\src\Project\Public\code\node_modules\jsdom\lib\jsdom\browser\Window.js:598:14)
      at _combinedTickCallback (internal/process/next_tick.js:131:7)
      at process._tickCallback (internal/process/next_tick.js:180:9)
    matcherResult:
     { actual: 1,
       expected: 2,
       message: [Function],
       name: 'toBe',
       pass: false } }

0 ответов

Другие вопросы по тегам