Próbuję uruchomić domyślny test jednostki usług w moim projekcie (wzięty z projektu Angular Seed w serwisie GitHub), ale wciąż pojawia się błąd „moduł nie jest zdefiniowany”.
Czytałem, że może to mieć coś wspólnego z kolejnością plików JavaScript , do których istnieją odwołania , ale nie wydaje mi się, aby to działało, więc mam nadzieję, że ktoś z was może być w stanie pomóc.
Moja konfiguracja do testu wygląda następująco:
basePath = '../';
files = [
'public / javascripts / lib / jquery-1.8.2.js',
'public / javascripts / lib / angular.js',
'public / javascripts / lib / angular- .js',
'public / app.js ',
' public / controllers / .js ',
' public / directives.js ',
' public / filter.js ',
' public / services.js ',
JAŚMIN,
JASMINE_ADAPTER,
' public / javascripts / lib / angular -mocks. js ',
' test / unit / *. js '];autoWatch = true;
browser = ['Chrome'];
junitReporter = {outputFile: 'test_out / unit.xml', suite: 'unit'};
Usługa wygląda następująco:
angular.module('myApp.services', []).
value('version', '0.1');
Test wygląda następująco:
'use strict';
describe('service', function() {
beforeEach(module('myApp.services'));
describe('version', function() {
it('should return current version', inject(function(version) {
expect(version).toEqual('0.1');
}));
});
});
A błąd podczas uruchamiania testu przez testacular jest następujący:
ReferenceError: moduł nie jest zdefiniowany
Odpowiedzi:
Brakuje pliku angular-mocks.js .
źródło
angular.module
iangular.mock.module
to nie to samo.window.module
Funkcja jest aliasemangular.mock.module
. Zobacz tę odpowiedź, aby uzyskać więcej informacji.angular-mocks
wkarma.conf.js
pliku i przeprowadzić testy przez Karmę, a nie Jasmine. W ten sposób, gdy Karma jest uruchomiona, pobieraangular-mocks
rozszerzenia i wprowadza je do środowiska.Miałem ten sam problem i zrozumiałem, dlaczego nie działa: javascript jasmine.js należy odwołać się PRZED plikiem angular-mocks.js. Rzeczywiście, angular-mocks.js sprawdza, czy Jasmine jest załadowana i tylko jeśli tak, doda funkcję modułu do okna.
Oto fragment kodu Angular Mocks:
(Edytuj po kilku komentarzach na temat `` hakowania '', które miałem poniżej: to tylko fragment kodu, to nie jest coś, co musisz pisać samemu, już tam jest!)
window.jasmine && (function(window) { [...] window.module = angular.mock.module = function() { var moduleFns = Array.prototype.slice.call(arguments, 0); return isSpecRunning() ? workFn() : workFn; ///////////////////// [...] };
W skrócie: po prostu odwołaj się do pliku jasmine.js przed angular-mocks.js i gotowe.
źródło
Ta
window.module
funkcja znajduje się w angular-mocks.js i jest skrótem dlaangular.mock.module
. Jak wspomniano w dokumentacji ,module
funkcja działa tylko z Jasmine.Używając Testacular , załaduje się następujący przykładowy plik konfiguracyjny
angular-mocks.js
./** example testacular.conf.js */ basePath = '../'; files = [ JASMINE, JASMINE_ADAPTER, 'path/to/angular.js', 'path/to/angular-mocks.js', // for angular.mock.module and inject. 'src/js/**/*.js', // application sources 'test/unit/**/*.spec.js' // specs ]; autoWatch = true; browsers = ['Chrome'];
I, jak sugerowano w innym miejscu, możesz uruchomić Testacular z rejestrowaniem debugowania, aby zobaczyć, jakie skrypty są ładowane (możesz również zobaczyć to samo w inspektorze):
testacular --log-level debug start config/testacular.conf.js
W
angular.mock.inject
docs to ładny kompletny przykład.źródło
module
teraz działa również z mokkąW naszych testach jednostkowych używamy „modułu” bez „kątowego” i działa dobrze.
CoffeeScript:
describe 'DiscussionServicesSpec', -> beforeEach module 'DiscussionServices' beforeEach inject ... etc.
który kompiluje się do
JavaScript:
describe('DiscussionServices', function() { beforeEach(module('DiscussionServices')); beforeEach(inject(function ... etc.
Jedyny przypadek, kiedy widzę coś podobnego do opisanego przez ciebie błędu, to sytuacja, gdy w pliku testacular.conf.js plik angular-mocks.js nie jest wymieniony w sekcji plików przed próbą użycia parametru „module”. Jeśli po testach umieszczę go na liście „plików”, którą otrzymuję
ReferenceError: Can't find variable: module
(Nasze testy są przeprowadzane przez PhantomJS)
źródło
Umieściłem angular-mocks.js w mojej konfiguracji karmy, ale nadal otrzymywałem błąd. Okazuje się, że kolejność jest ważna w tablicy plików. (duh) Podobnie jak w nagłówku dokumentu html, jeśli skrypt wywołuje angular przed jego zdefiniowaniem i pojawia się błąd. Musiałem więc po prostu dołączyć plik app.js po angular.js i angular-mocks.js.
źródło
Jeśli używasz Yeoman i jego generatora kątów, prawdopodobnie otrzymujesz ten błąd. Zwłaszcza gdy robisz samouczek (._.)
Naprawiłem to, kopiując plik angular-mocks.js z katalogu bower_components / angular-mocks do katalogu test / mock. Oczywiście musisz mieć pewność, że Twój plik karma.conf.js jest poprawnie skonfigurowany.
Pozdrowienia!
źródło
Miałem ten sam problem, kiedy robiłem coś takiego
var module = angular.module('my',[])
. Musiałem się upewnić, że jest otoczony przez IIFEźródło