Dịch vụ kiểm tra trong mô đun trả về Angular không được xác định


127

Tôi đang cố gắng chạy thử nghiệm đơn vị dịch vụ mặc định trong dự án của mình (Lấy từ dự án Angular Seed trên GitHub), nhưng tôi vẫn nhận được lỗi "mô-đun không được xác định".

Tôi đã đọc được rằng nó có thể là một cái gì đó để làm theo thứ tự của các tệp JavaScript được tham chiếu , nhưng tôi dường như không thể làm cho nó hoạt động được, vì vậy hy vọng một trong các bạn có thể giúp đỡ.

Cấu hình của tôi cho bài kiểm tra trông như thế này:

basePath = '../';

files = [
'public / javascripts / lib / jquery-1.8.2.js',
'public / javascripts / lib / angular.js',
'public / javascripts / lib / angular- .js',
'public / app.js ',
' công cộng / bộ điều khiển /
.js ',
' công khai / directives.js ',
' công cộng / bộ lọc.js ',
' công cộng / dịch vụ ',
JASMINE,
JASMINE_ADAPTER,
' công khai / javascripts / lib / angular-mocks. js ',
' kiểm tra / đơn vị / *. js '];

autoWatch = true;

trình duyệt = ['Chrome'];

junitReporter = {outputFile: 'testDef / unit.xml', bộ: 'unit'};

Dịch vụ này trông như sau:

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

Bài kiểm tra trông như thế này:

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

Và lỗi khi chạy thử nghiệm qua testacular là đây:

ReferenceError: mô-đun không được xác định


2
bạn có thể chia sẻ dự án của bạn ở đâu đó không? Tôi có thể giúp. Bạn đã thử bật mức DEBUG cho bản thử nghiệm để xem tệp nào thực sự được tải dựa trên cấu hình của bạn chưa? Bây giờ phần đáng ngờ là phần này: công khai / javascripts / lib / angular-.js - nó nên phù hợp với cái gì?
pkozlowski.opensource

@JohnDoe Cảm ơn đã làm việc. Nếu bạn thêm một câu trả lời tôi sẽ đánh dấu nó là giải quyết. Lý do là tôi đã theo dõi dự án hạt giống, đã làm theo cách đó và nó đã hoạt động. Tôi không biết có phải vì đó là phiên bản cũ hơn không.
Dofs

@Dofs Các lỗi chính tả "'công khai / javascripts / lib / angular-.js'," và "'public / controls / .js'"?
Ryan O'Nillill

@ RyanO'Neill xin lỗi, vâng, đây là một lỗi đánh máy.
Dofs

Câu trả lời:


260

Bạn đang thiếu tệp angular-mocks.js .


8
Lưu ý rằng angular.moduleangular.mock.modulekhông giống nhau. Các window.modulechức năng là một bí danh cho angular.mock.module. Xem câu trả lời này để biết thêm.
Tim Schaub

Như bình luận trước đây đã nói, angular.module không phải là bí danh cho angular.mock.module.
Filippo De Luca

7
Câu trả lời này sẽ hữu ích hơn nhiều nếu nó đưa ra bất kỳ lời khuyên nào về cách cung cấp tệp nói. Tôi cần cài đặt Bower, rồi NgMocks.
isherwood

4
Câu trả lời chỉ cung cấp một phần của giải pháp. Đây thực sự là một bình luận và không phải là một lời giải thích. Một số câu trả lời dưới đây chi tiết hơn nhiều.
Gerome Bochmann

1
Đối với người mới bắt đầu, bạn cần thêm một tài liệu tham khảo angular-mockstrong karma.conf.jstệp và chạy thử nghiệm thông qua Karma, không phải Jasmine. Bằng cách này, khi Karma được chạy, nó chọn các angular-mocksphần mở rộng và kết hợp chúng vào môi trường.
Lu-ca

41

Tôi có cùng một vấn đề và tôi hiểu tại sao nó không hoạt động: javascript jasmine.js phải được tham chiếu TRƯỚC tệp angular-mocks.js. Thật vậy, angular-mocks.js kiểm tra xem Jasmine đã được tải chưa và chỉ khi có nó, nó sẽ thêm chức năng mô-đun vào cửa sổ.

Dưới đây là trích xuất mã Angular Mocks:

(Chỉnh sửa sau một vài bình luận về 'hack' tôi đã có bên dưới: đây chỉ là một đoạn trích của mã, đây không phải là thứ bạn cần tự viết, nó đã có sẵn!)

window.jasmine && (function(window) {

[...]

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

Tóm lại: Chỉ cần tham khảo jasmine.js của bạn trước khi angular-mocks.js và bạn đi.


Điều này cũng có thể được giải quyết bằng cách đảm bảo các tệp javascript hoa nhài được tải trước các góc cạnh. Giải pháp sạch hơn là thực hiện các thay đổi hacky để có được công cụ để làm việc.
foomip

@foomip Ai đề nghị thực hiện thay đổi hacky?
Stephen

Về cơ bản, bạn đã chèn một bản hack vào ứng dụng của mình để đảm bảo rằng mọi thứ tải đúng cách - và tôi không có ý hack theo cách xấu (không có gì sai với cách bạn viết đoạn mã đó) nhưng điều gì xảy ra khi một cập nhật lên hoa nhài hoặc thứ gì khác khiến đoạn trích của bạn bị hỏng hoặc không còn hoạt động như mong đợi? Điều đó có thể hoặc không thể xảy ra, nhưng đó là một trách nhiệm trong mã của bạn bây giờ có thể tránh được, bạn có nghĩ vậy không?
foomip

@foomip: Tôi không chắc bạn đang đề cập đến điều gì, nhưng nếu đó là về mã của tôi ở trên, thì đây không phải là do tôi viết, tôi chỉ trích dẫn nó để giải thích vấn đề. Mã này là một phần của mocks góc. Việc khắc phục chỉ đơn giản là vấn đề tham chiếu một tệp trước tệp kia.
Antoine Jaussoin

36

Các window.modulechức năng đi kèm trong góc-mocks.js và là một viết tắt cho angular.mock.module. Như đã đề cập trong các tài liệu , modulechức năng chỉ hoạt động với Jasmine.

Sử dụng Testacular , tệp cấu hình ví dụ sau sẽ tải 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'];

Và, như được đề xuất ở nơi khác, bạn có thể chạy Testacular với ghi nhật ký gỡ lỗi để xem tập lệnh nào được tải (bạn cũng có thể thấy điều tương tự trong trình kiểm tra):

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

Các angular.mock.injecttài liệu bao gồm một ví dụ khá đầy đủ.


Có lẽ đáng chú ý là modulebây giờ cũng hoạt động với mocha
Robin-Hoodie

11

Chúng tôi sử dụng 'mô-đun' không có 'góc cạnh' trong các thử nghiệm đơn vị của mình và nó hoạt động tốt.

CoffeeScript:

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

mà biên dịch thành

JavaScript:

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

Lần duy nhất tôi thấy một cái gì đó giống như lỗi bạn mô tả là nếu trong tệp testacular.conf.js, tệp angular-mocks.js không được liệt kê trong phần tệp trước khi thông số kỹ thuật cố gắng sử dụng 'mô-đun'. Nếu tôi đặt nó sau khi thử nghiệm trong danh sách 'tệp' tôi nhận được

ReferenceError: Can't find variable: module

(Các thử nghiệm của chúng tôi đang được chạy qua PhantomJS)


2
Điều để kết luận là góc cạnh là một yêu cầu.
Adrien

3

Tôi đã bao gồm angular-mocks.js trong cấu hình karma của mình, nhưng vẫn gặp lỗi. Hóa ra thứ tự là quan trọng trong mảng tập tin. (duh) Giống như trong phần đầu của tài liệu html, nếu tập lệnh gọi góc trước khi được xác định và xảy ra lỗi. Vì vậy, tôi chỉ cần đưa app.js của mình vào sau angular.js và angular-mocks.js.


0

Nếu bạn đang sử dụng Yeoman và trình tạo góc của nó, bạn có thể gặp lỗi này. Đặc biệt là khi bạn thực hiện Hướng dẫn (._.)
Tôi đã sửa nó, bằng cách sao chép tệp angular-mocks.js, từ thư mục bower_components / angular-mocks sang thư mục test / mock. Tất nhiên bạn phải chắc chắn rằng tệp karma.conf.js của bạn được cấu hình đúng.
Lời chào hỏi!


0

Tôi đã có vấn đề tương tự khi tôi đang làm một cái gì đó như var module = angular.module('my',[]). Tôi cần chắc chắn rằng nó được bao quanh bởi IIFE

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.