Próbuję zrozumieć, jak opracować samodzielny kod JavaScript. Chcę napisać kod Javscript za pomocą testów i modułów, uruchamianych z wiersza poleceń. Zainstalowałem więc node.js
i npm
wraz z bibliotekami requirejs
, underscore
i mocha
.Dlaczego widzę komunikat "define not defined" podczas uruchamiania testu Mocha z RequireJS?
Moja struktura katalogów wygląda następująco:
> tree .
.
├── node_modules
├── src
│ └── utils.js
└── test
└── utils.js
gdzie src/utils.js
jest mały moduł, który piszę, z następującego kodu:
> cat src/utils.js
define(['underscore'], function() {
"use strict";
if ('function' !== typeof Object.beget) {
Object.beget = function (o) {
var f = function() {
};
f.prototype = o;
return new f();
};
}
});
i test/utils.js
jest test:
> cat test/utils.js
var requirejs = require('requirejs');
requirejs.config({nodeRequire: require});
requirejs(['../src/utils'], function(utils) {
suite('utils', function() {
test('should always work', function() {
assert.equal(1, 1);
})
})
});
którą następnie próbuję uruchomić z katalogu najwyższego poziomu (tak mocha
widzi katalog test
):
> mocha
node.js:201
throw e; // process.nextTick error, or 'error' event on first tick
^
Error: Calling node's require("../src/utils") failed with error: ReferenceError: define is not defined
at /.../node_modules/requirejs/bin/r.js:2276:27
at Function.execCb (/.../node_modules/requirejs/bin/r.js:1872:25)
at execManager (/.../node_modules/requirejs/bin/r.js:541:31)
...
Więc moje pytania to:
- Czy to poprawny sposób struktura kodu?
- Dlaczego mój test nie działa?
- Jaki jest najlepszy sposób na naukę tego typu rzeczy? Mam trudności ze znalezieniem dobrych przykładów w Google.
Dzięki ...
[przepraszam - chwilowo pisał wyniki niewłaściwym kodem; naprawiono teraz]
PS Używam requirejs, ponieważ chcę również uruchomić ten kod (lub jego część) z przeglądarki, później.
Aktualizacja/Rozwiązanie
coś, co nie jest w poniższych odpowiedzi jest to, że potrzebne do korzystania mocha -u tdd
dla stylu testowej powyżej. Oto test końcowy (który wymaga również assert) i jego zastosowanie:
> cat test/utils.js
var requirejs = require('requirejs');
requirejs.config({nodeRequire: require});
requirejs(['../src/utils', 'assert'], function(utils, assert) {
suite('utils', function() {
test('should always work', function() {
assert.equal(1, 1);
})
})
});
> mocha -u tdd
.
✔ 1 tests complete (1ms)
Dla mnie, aby to działało, potrzebuję zainstalować moduł amdefine i dodać ten wiersz coffeescript = >> define = require ('amdefine') (moduł) if (typeof define! = 'Function') << = into mój plik "klasy", aby działał (nie plik testowy). Jest to trochę denerwujące, ponieważ trzeba mieć zadanie, aby usunąć to po przetestowaniu – devric