Имитация передачи параметра URL - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь понять, как войти в TDD для браузера JS, используя Mocha.

Я немного знаю Node JS и, по сути, хочу разработать новую версию JS на стороне клиентаВеб-приложение, использующее TDD.

Я предпринял первые шаги по установке и тестированию Mocha и Chai.

Как мне проверить обработку параметра, включенного после "?""в URL-адресе, переданном в index.html, который, в свою очередь, выглядит следующим образом:

<head>
[...]
    <script src='generic_elements/index.js'></script>
</head>
<body onload="init()">
</body>

... поэтому index.js затем обрабатывает URL-адрес, который в моем не-TDD проекте я обрабатываю какthis:

let url, formName;

function main(){
    url = document.location.href;
    [...]
    if ( url.indexOf( '?' ) != -1){
        urlParams = url.substring(( url.indexOf( '?' ) + 1 ), url.length );
        if( urlParams.includes( '&' )){
            // divide stuff up like this
            urlComponents = urlParams.split( /[&=]/ );
            formName = urlComponents[ 0 ];
        }
    [...]

async function init(){
    [...]
    const filename = formName + '.js';
    const response = await fetch( filename, {
        method: 'HEAD',
        cache: 'no-cache'
    });
    [...]


main();

Очевидно, что в браузере происходит то, что JS-скрипт вызывается в фазе head HTML-файла и таким образом вызывает main(). Это извлекает параметр из URL после "?"(проверяя, чтобы убедиться, что он есть), и затем эта init() функция вызывается в onload. Он использует вычисленное значение formName, чтобы определить, какой файл JS начать выполнять.

Моя попытка выполнить тест Мокко такова:

const expect = require('chai').expect;
const indexJS = require( '../index' );

describe('#index.js runs the right file()', function() {

    context('with URL parameter', function() {
        it('should run the appropriate JS file', function() {
            console.log( `z indexJS:` )
            console.log( indexJS )
            console.log( `z indexJS.document ${indexJS.document}` )
            indexJS.document = new Object();
            indexJS.document.location = new Object();
            indexJS.document.location.href = '/blahblah?fileToRun'
            indexJS.main();
            indexJS.init();
            expect( indexJS.formName ).to.be.a( 'string' ).that.equals( 'fileToRun.js' );
            ... // somehow test that this JS file is run...

            // DEV
            return false
        })
    })
})

indexJS - пустое значение object, document - это undefined, и эта ошибка завершается с "TypeError: indexJS.main не является функцией в Context. (Test / indexJSRunsTheRightFile.js: 14: 12)" ... не удивительно, возможно.

Что я делаю не так? Как я могу получить глобальный объект index.js, с атрибутами document, main и init в частности? Будь то реальный объект или издевательство, заглушка, шпион и т. Д.?

...