Я пытаюсь понять, как войти в 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
в частности? Будь то реальный объект или издевательство, заглушка, шпион и т. Д.?