Layanan pengujian dalam modul pengembalian Angular tidak ditentukan

127

Saya mencoba menjalankan tes unit layanan default di proyek saya (Diambil dari proyek Benih Angular di GitHub), tetapi saya terus mendapatkan kesalahan "modul tidak ditentukan".

Saya telah membaca bahwa itu mungkin ada hubungannya dengan urutan file JavaScript yang direferensikan , tetapi sepertinya saya tidak dapat membuatnya berfungsi, jadi semoga salah satu dari Anda mungkin dapat membantu.

Konfigurasi saya untuk pengujian terlihat seperti ini:

basePath = '../';

files = [
'publik / javascripts / lib / jquery-1.8.2.js',
'public / javascripts / lib / angular.js',
'publik / javascripts / lib / angular- .js',
'public / app.js ',
' public / controllers /
.js ',
' public / directives.js ',
' public / filter.js ',
' public / services.js ',
JASMINE,
JASMINE_ADAPTER,
' public / javascripts / lib / angular-mock. js ',
' test / unit / *. js '];

autoWatch = true;

browser = ['Chrome'];

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

Layanannya terlihat seperti berikut:

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

Tesnya terlihat seperti ini:

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

Dan kesalahan saat menjalankan tes melalui testacular adalah ini:

ReferenceError: modul tidak didefinisikan

Dofs
sumber
2
dapatkah Anda membagikan proyek Anda di suatu tempat? Saya mungkin bisa membantu. Apakah Anda mencoba mengaktifkan level DEBUG untuk testacular untuk melihat file mana yang sebenarnya dimuat berdasarkan konfigurasi Anda? Untuk saat ini bagian yang mencurigakan adalah derai ini: public / javascripts / lib / angular-.js - apa yang harus cocok?
pkozlowski.opensource
@ JohnDoe Terima kasih, itu berhasil. Jika Anda menambahkan jawaban, saya akan menandainya sebagai terselesaikan. Alasannya adalah karena saya mengikuti proyek benih, yang melakukannya dengan cara itu, dan yang berhasil. Saya tidak tahu apakah itu karena itu versi yang lebih lama.
Dofs
@Dof Apakah "'public / javascripts / lib / angular-.js'," dan "'public / controllers / .js'"?
Ryan O'Neill
@ RyanO'Neill maaf, ya ini salah ketik.
Dofs

Jawaban:

260

Anda kehilangan file angular-mocks.js .

John Doe
sumber
8
Perhatikan bahwa angular.moduledan angular.mock.moduleyang tidak sama. The window.modulefungsi alias untuk angular.mock.module. Lihat jawaban ini untuk lebih lanjut.
Tim Schaub
Seperti komentar sebelumnya mengatakan, angular.module bukan alias untuk angular.mock.module.
Filippo De Luca
7
Jawaban ini akan jauh lebih berguna jika menawarkan saran tentang cara menyediakan file tersebut. Saya perlu menginstal Bower, lalu NgMocks.
isherwood
4
Jawabannya hanya menyediakan sebagian dari solusi. Ini sebenarnya adalah komentar dan bukan penjelasan. Beberapa jawaban di bawah ini jauh lebih terperinci.
Gerome Bochmann
1
Untuk pemula, Anda perlu menambahkan referensi ke angular-mocksdalam karma.conf.jsfile, dan menjalankan tes melalui Karma, bukan Jasmine. Dengan cara ini, ketika Karma dijalankan, ia mengambil angular-mocksekstensi dan memasukkannya ke dalam lingkungan.
Lukas
41

Saya memiliki masalah yang sama, dan saya mengerti mengapa itu tidak berfungsi: javascript jasmine.js harus dirujuk SEBELUM file angular-mocks.js. Memang, angular-mocks.js memeriksa apakah Jasmine dimuat, dan hanya jika itu akan menambah fungsi modul ke jendela.

Berikut ini adalah ekstrak kode Angular Mocks:

(Sunting setelah beberapa komentar tentang 'peretasan' yang saya punya di bawah: ini hanya ekstrak kode, ini bukan sesuatu yang perlu Anda tulis sendiri, sudah ada di sana!)

window.jasmine && (function(window) {

[...]

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

Singkatnya: Cukup referensi jasmine.js Anda sebelum angular-mocks.js dan pergilah.

Antoine Jaussoin
sumber
Ini juga dapat diatasi dengan memastikan file javascript jasmine dimuat sebelum angular-mock. Solusi lebih bersih daripada membuat perubahan hacky untuk mendapatkan pekerjaan.
foomip
@foomip Siapa yang menyarankan melakukan perubahan yang diretas?
Stephen
Anda pada dasarnya memasukkan retasan ke dalam aplikasi Anda untuk memastikan bahwa semuanya memuat dengan cara yang benar - dan maksud saya bukan retasan dengan cara yang buruk (tidak ada yang salah dengan cara Anda menulis potongan kode itu) tetapi apa yang terjadi ketika sebuah memperbarui ke melati atau sesuatu yang lain menyebabkan cuplikan Anda rusak atau tidak lagi berfungsi seperti yang diharapkan? Itu bisa atau tidak bisa terjadi, tetapi itu adalah kewajiban dalam kode Anda sekarang yang bisa dihindari, bukan begitu?
foomip
@foomip: Saya tidak yakin apa yang Anda maksud, tetapi jika ini tentang kode saya di atas, ini tidak ditulis oleh saya, saya hanya mengutipnya untuk menjelaskan masalah ini. Kode adalah bagian dari sudut-mengolok-olok. Cara mengatasinya hanyalah masalah merujuk satu file sebelum yang lain.
Antoine Jaussoin
36

The window.moduleFungsi datang dalam sudut-mocks.js dan merupakan istilah untuk angular.mock.module. Seperti disebutkan dalam dokumen , modulefungsinya hanya bekerja dengan Jasmine.

Menggunakan Testacular , contoh file konfigurasi berikut ini akan memuat 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'];

Dan, seperti yang disarankan di tempat lain, Anda dapat menjalankan Testacular dengan debug logging untuk melihat skrip apa yang dimuat (Anda juga dapat melihat hal yang sama di inspektur):

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

The angular.mock.injectdocs termasuk contoh lengkap cantik.

Tim Schaub
sumber
Mungkin perlu dicatat bahwa modulesekarang juga bekerja dengan moka
Robin-Hoodie
11

Kami menggunakan 'modul' tanpa 'sudut' dalam pengujian unit kami dan itu berfungsi dengan baik.

CoffeeScript:

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

yang mengkompilasi ke

JavaScript:

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

Satu-satunya waktu saya melihat sesuatu seperti kesalahan yang Anda gambarkan adalah jika dalam file testacular.conf.js file angular-mocks.js tidak terdaftar di bagian file sebelum spesifikasi mencoba menggunakan 'modul'. Jika saya letakkan setelah tes saya di daftar 'file' saya dapatkan

ReferenceError: Can't find variable: module

(Tes kami sedang dijalankan melalui PhantomJS)

Ryan O'Neill
sumber
2
Yang harus disimpulkan adalah sudut-mengejek adalah persyaratan.
Adrien
3

Saya telah memasukkan angular-mocks.js dalam konfigurasi karma saya, tetapi masih mendapatkan kesalahan. Ternyata urutannya penting dalam array file. (duh) Sama seperti di kepala html doc, jika skrip memanggil sudut sebelum ditentukan, dan terjadi kesalahan. Jadi saya hanya harus memasukkan app.js saya setelah angular.js dan angular-mocks.js.

Erik
sumber
0

Jika Anda menggunakan Yeoman dan generator sudutnya, Anda mungkin mendapatkan kesalahan ini. Terutama ketika Anda melakukan Tutorial (._.)
Saya memperbaikinya, dengan menyalin file angular-mocks.js, dari bower_components / angular-mock dir ke test / mock dir. Tentu saja Anda harus yakin, bahwa file karma.conf.js Anda telah dikonfigurasi dengan benar.
Salam pembuka!

alxU
sumber
0

Saya memiliki masalah yang sama ketika saya melakukan sesuatu seperti var module = angular.module('my',[]). Saya perlu memastikan bahwa itu dikelilingi oleh IIFE

Jackie
sumber