Angular iade modülünde test hizmeti tanımlanmadı


127

Projemde varsayılan hizmet birimi testini çalıştırmaya çalışıyorum (GitHub'daki Angular Seed projesinden alınmıştır), ancak "modül tanımlı değil" hatasını almaya devam ediyorum.

Referans verilen JavaScript dosyalarının sırasına göre bir şey olabileceğini okudum , ancak işe yarayacak gibi görünmüyorum, bu yüzden umarım biriniz yardımcı olabilir.

Test için yapılandırmam şöyle görünüyor:

basePath = '../';

dosyalar = [
'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 / filters.js ',
' public / services.js ',
JASMINE,
JASMINE_ADAPTER,
' public / javascripts / lib / angular-mocks. js ',
' test / birim / *. js '];

autoWatch = true;

tarayıcılar = ['Chrome'];

junitReporter = {outputFile: 'test_out / unit.xml', suite: 'unit'};

Hizmet şuna benzer:

angular.module('myApp.services', []).
  value('version', '0.1');

Test şuna benzer:

'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');
    }));
  });
});

Ve testi testacular aracılığıyla çalıştırırken oluşan hata şudur:

ReferenceError: modül tanımlanmadı


2
projenizi bir yerde paylaşır mısınız? Belki ben yardımcı olabilirim. Yapılandırmanıza bağlı olarak hangi dosyaların gerçekten yüklendiğini görmek için testacular için DEBUG düzeyini açmayı denediniz mi? Şimdilik şüpheli kısım şu pıtırtı: public / javascripts / lib / angular-.js - neyle eşleşmeli?
pkozlowski.opensource

@JohnDoe Teşekkürler işe yaradı. Bir cevap eklerseniz, onu çözüldü olarak işaretleyeceğim. Sebep, o şekilde yapan ve işe yarayan tohum projesini takip ediyor olmamdı. Daha eski bir sürüm olduğu için mi bilmiyorum.
Dofs

@Dofs "'public / javascripts / lib / angular-.js'," ve "'public / controllers / .js'" yazım hataları mı?
Ryan O'Neill

@ RyanO'Neill üzgünüm, evet bu bir yazım hatasıydı.
Dofs

Yanıtlar:


260

Angular-mocks.js dosyası eksik .


8
Bunu angular.moduleve angular.mock.moduleaynı olmadığını unutmayın . window.moduleFonksiyon için bir takma ad angular.mock.module. Daha fazlası için bu yanıta bakın .
Tim Schaub

Önceki yorumun dediği gibi, angular.module, angular.mock.module için bir takma ad değildir.
Filippo De Luca

7
Bu yanıt, söz konusu dosyanın nasıl sağlanacağına dair herhangi bir tavsiye sunması halinde çok daha faydalı olacaktır. Bower'ı, ardından NgMocks'u kurmam gerekiyordu.
isherwood

4
Cevap, çözümün yalnızca bir kısmını sağlar. Bu aslında bir yorumdur ve bir açıklama değildir. Aşağıdaki cevaplardan bazıları çok daha ayrıntılıdır.
Gerome Bochmann

1
Yeni başlayanlar angular-mocksiçin karma.conf.jsdosyaya bir referans eklemeniz ve testleri Jasmine değil Karma ile çalıştırmanız gerekir. Bu şekilde, Karma çalıştırıldığında angular-mocksuzantıları alır ve çevreye dahil eder.
Luke

41

Aynı sorunu yaşadım ve neden çalışmadığını anladım: jasmine.js javascript , angular-mocks.js dosyasından ÖNCE başvurulmalıdır . Aslında, angular-mocks.js, Jasmine'in yüklü olup olmadığını kontrol eder ve yalnızca yüklüyse, modül işlevini pencereye ekler.

İşte bir olan özü Açısal Mocks kod:

(Aşağıda 'hackleme' ile ilgili birkaç yorumdan sonra düzenleyin: bu sadece kodun bir özeti, bu kendi kendinize yazmanız gereken bir şey değil, zaten orada!)

window.jasmine && (function(window) {

[...]

  window.module = angular.mock.module = function() {
    var moduleFns = Array.prototype.slice.call(arguments, 0);
    return isSpecRunning() ? workFn() : workFn;
    /////////////////////
    [...]
  };

Özetle: Angular-mocks.js'den önce jasmine.js dosyanızı referans alın ve başlayın.


Bu, yasemin javascript dosyalarının açısal taklitlerden önce yüklendiğinden emin olarak da çözülebilir. İşlerin çalışmasını sağlamak için karmaşık değişiklikler yapmaktan daha temiz çözüm.
foomip

@foomip Hacky değişiklikleri yapmayı kim önerdi?
Stephen

İşlerin doğru şekilde yüklendiğinden emin olmak için esasen uygulamanıza bir hack yerleştirdiniz - ve ben kötü bir şekilde hacklemek istemedim (bu kod parçacığını yazma şeklinizde yanlış bir şey yok) ama ne olursa olsun ne olur? yasemin güncellemeniz veya başka bir şey, pasajınızın kırılmasına veya artık beklendiği gibi çalışmamasına neden oluyor mu? Olabilirdi ya da olamazdı, ama bu artık kodunuzda önlenebilecek bir sorumluluk değil mi?
foomip

@foomip: Neden bahsettiğinizden emin değilim, ancak yukarıdaki kodumla ilgiliyse, bu benim tarafımdan yazılmamış, yalnızca sorunu açıklamak için alıntı yapıyorum. Kod, açısal taklitlerin bir parçasıdır. Düzeltme, bir dosyaya diğerinden önce başvurma meselesidir.
Antoine Jaussoin

36

window.moduleİşlev gelir açısal mocks.js ve bir kısaltmadır angular.mock.module. Belgelerde bahsedildiği gibi ,module işlev yalnızca Jasmine ile çalışır.

Kullanılması Testacular , Aşağıdaki örnek yapılandırma dosyası yükleyecektir 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'];

Ve başka bir yerde önerildiği gibi, hangi komut dosyalarının yüklendiğini görmek için Testacular'ı hata ayıklama günlüğü ile çalıştırabilirsiniz (aynısını denetçide de görebilirsiniz):

testacular --log-level debug start config/testacular.conf.js

angular.mock.injectDokümanlar oldukça eksiksiz bir örnek sayılabilir.


Belki de moduleartık mocha ile de çalıştığını belirtmeye değer
Robin-Hoodie

11

Birim testlerimizde 'açısal' olmayan 'modül' kullanıyoruz ve iyi çalışıyor.

CoffeeScript:

describe 'DiscussionServicesSpec', ->
    beforeEach module 'DiscussionServices'
    beforeEach inject ... etc.

hangi derleme

JavaScript:

describe('DiscussionServices', function() {
    beforeEach(module('DiscussionServices'));
    beforeEach(inject(function ... etc.

Açıkladığınız hataya benzer bir şey gördüğüm tek zaman, testacular.conf.js dosyasında angular-mocks.js dosyasının, 'modül' kullanmaya çalışan özelliklerden önce dosyalar bölümünde listelenmemiş olmasıdır. Testlerimden sonra aldığım 'dosyalar' listesine koyarsam

ReferenceError: Can't find variable: module

(Testlerimiz PhantomJS üzerinden yürütülüyor)


2
Sonuç olarak, açısal taklitler bir gerekliliktir.
Adrien

3

Angular-mocks.js'yi karma yapılandırmama dahil ettim, ancak yine de hatayı alıyordum. Files dizisindeki sıranın önemli olduğu ortaya çıktı. (duh) Tıpkı bir html belgesinin başındaki gibi, eğer bir betik tanımlanmadan önce köşeli çağırırsa ve hata oluşursa. Bu yüzden, angular.js ve angular-mocks.js'den sonra app.js'mi eklemem gerekiyordu.


0

Yeoman'ı ve onun açısal oluşturucusunu kullanıyorsanız, muhtemelen bu hatayı alırsınız. Özellikle Tutorial'ı (._.)
Yaptığınızda, angular-mocks.js dosyasını bower_components / angular-mocks dizininden test / mock dizinine kopyalayarak düzelttim. Elbette karma.conf.js dosyanızın doğru yapılandırıldığından emin olmalısınız.
Selamlar!


0

Ben de böyle bir şey yaparken aynı sorunu yaşadım var module = angular.module('my',[]). IIFE ile çevrili olduğundan emin olmam gerekiyordu

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.