ไม่ได้กำหนดบริการทดสอบในโมดูลผลตอบแทนเชิงมุม


127

ฉันพยายามเรียกใช้การทดสอบหน่วยบริการเริ่มต้นในโครงการของฉัน (นำมาจากโครงการ Angular Seed บน GitHub) แต่ฉันได้รับข้อผิดพลาด "ไม่ได้กำหนดโมดูล"

ฉันได้อ่านแล้วว่ามันอาจเกี่ยวข้องกับลำดับของไฟล์ JavaScript ที่อ้างอิงแต่ดูเหมือนจะไม่สามารถใช้งานได้ดังนั้นหวังว่าคุณคนใดคนหนึ่งจะสามารถช่วยได้

การกำหนดค่าของฉันสำหรับการทดสอบมีลักษณะดังนี้:

basePath = '../';

ไฟล์ = [
'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 ',
' ทดสอบ / หน่วย / *. js '];

autoWatch = จริง;

เบราว์เซอร์ = ['Chrome'];

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

บริการมีลักษณะดังต่อไปนี้:

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

การทดสอบมีลักษณะดังนี้:

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

และข้อผิดพลาดเมื่อเรียกใช้การทดสอบผ่าน testacular คือ:

ReferenceError: ไม่ได้กำหนดโมดูล


2
คุณสามารถแบ่งปันโครงการของคุณได้หรือไม่ ฉันอาจจะช่วยได้ คุณลองเปิดระดับ DEBUG สำหรับ testacular เพื่อดูว่าไฟล์ใดถูกโหลดจริงตามการกำหนดค่าของคุณหรือไม่? ตอนนี้ส่วนที่น่าสงสัยคือรูปแบบนี้: public / javascripts / lib / angular-.js - ควรจับคู่อะไร
pkozlowski.opensource

@JohnDoe ขอบคุณที่ทำงาน หากคุณเพิ่มคำตอบฉันจะทำเครื่องหมายว่าแก้ไขแล้ว เหตุผลก็คือฉันทำตามโครงการเมล็ดพันธุ์ซึ่งทำแบบนั้นและได้ผล ฉันไม่รู้ว่าเป็นเพราะมันเป็นเวอร์ชั่นก่อนหน้านี้หรือเปล่า
Dofs

@Dofs "public / javascripts / lib / angular-.js" และ "" public / controllers / .js "พิมพ์ผิดหรือไม่
Ryan O'Neill

@ RyanO'Neill ขอโทษใช่นี่เป็นการพิมพ์ผิด
Dofs

คำตอบ:


260

คุณไม่มีเชิงมุม-mocks.jsไฟล์


8
โปรดทราบว่าangular.moduleและangular.mock.moduleมีไม่เหมือนกัน ฟังก์ชั่นเป็นนามแฝงสำหรับwindow.module angular.mock.moduleดูคำตอบนี้สำหรับข้อมูลเพิ่มเติม
Tim Schaub

ตามที่ความเห็นก่อนหน้านี้ angular.module ไม่ใช่นามแฝงของ angular.mock.module
Filippo De Luca

7
คำตอบนี้จะมีประโยชน์มากขึ้นหากมีคำแนะนำเกี่ยวกับวิธีการจัดเตรียมไฟล์ดังกล่าว ฉันต้องการติดตั้ง Bower จากนั้นก็ NgMocks
isherwood

4
คำตอบเป็นเพียงส่วนหนึ่งของการแก้ปัญหา นี่เป็นความคิดเห็นไม่ใช่คำอธิบาย คำตอบบางส่วนด้านล่างมีรายละเอียดมากกว่านี้มาก
Gerome Bochmann

1
สำหรับผู้เริ่มต้นคุณต้องเพิ่มข้อมูลอ้างอิงangular-mocksในkarma.conf.jsไฟล์และเรียกใช้การทดสอบผ่าน Karma ไม่ใช่ Jasmine วิธีนี้เมื่อมีการเรียกใช้ Karma มันจะหยิบangular-mocksส่วนขยายและรวมเข้ากับสภาพแวดล้อม
ลุค

41

ฉันมีปัญหาเดียวกันและฉันเข้าใจว่าทำไมมันไม่ทำงาน: จาวาสคริปต์จัสมิน js ต้องอ้างอิงก่อนไฟล์ angular-mocks.js อันที่จริง angular-mocks.js จะตรวจสอบว่าจัสมินโหลดอยู่หรือไม่และจะเพิ่มฟังก์ชันโมดูลลงในหน้าต่างเท่านั้น

นี่คือสารสกัดจาก Angular Mocks code:

(แก้ไขหลังจากความคิดเห็นเล็กน้อยเกี่ยวกับ 'การแฮ็ก' ที่ฉันมีด้านล่าง: นี่เป็นเพียงส่วนหนึ่งของโค้ดนี่ไม่ใช่สิ่งที่คุณต้องเขียนด้วยตัวเองมีอยู่แล้ว!)

window.jasmine && (function(window) {

[...]

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

สรุป: เพียงอ้างอิงJasmine.js ของคุณก่อน angular-mocks.js และปิดคุณไป


นอกจากนี้ยังสามารถแก้ไขได้โดยตรวจสอบให้แน่ใจว่าไฟล์ javascript จัสมินถูกโหลดก่อน angular-mocks โซลูชันที่สะอาดกว่าการเปลี่ยนแปลงแฮ็คเพื่อให้สิ่งต่างๆทำงานได้
foomip

@foomip ใครแนะนำให้ทำการเปลี่ยนแปลงแฮ็ค
Stephen

คุณแทรกการแฮ็กเข้าไปในแอปของคุณเป็นหลักเพื่อให้แน่ใจว่าสิ่งต่างๆโหลดในรูปแบบที่ถูกต้อง - และฉันไม่ได้หมายถึงการแฮ็กในทางที่ไม่ดี (ไม่มีอะไรผิดปกติกับวิธีที่คุณเขียนข้อมูลโค้ดนั้น) แต่จะเกิดอะไรขึ้นเมื่อ การอัปเดตเป็นดอกมะลิหรืออย่างอื่นทำให้ข้อมูลโค้ดของคุณเสียหายหรือไม่ทำงานตามที่คาดไว้? มันอาจเกิดขึ้นได้หรือไม่ได้ แต่นั่นเป็นความรับผิดในรหัสของคุณตอนนี้ที่สามารถหลีกเลี่ยงได้คุณไม่คิดเหรอ?
foomip

@foomip: ฉันไม่แน่ใจว่าคุณกำลังอ้างถึงอะไร แต่ถ้ามันเกี่ยวกับโค้ดของฉันข้างบนฉันไม่ได้เขียนฉันแค่อ้างเพื่ออธิบายปัญหาเท่านั้น รหัสนี้เป็นส่วนหนึ่งของ angular-mocks การแก้ไขเป็นเพียงเรื่องของการอ้างถึงไฟล์หนึ่งก่อนไฟล์อื่น ๆ
Antoine Jaussoin

36

window.moduleฟังก์ชั่นมาในมุม-mocks.jsangular.mock.moduleและเป็นชวเลขเป็น เป็นที่กล่าวถึงในเอกสารที่moduleฟังก์ชั่นใช้งานได้เฉพาะกับจัสมิน

ใช้Testacular , 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'];

และตามที่แนะนำในที่อื่น ๆ คุณสามารถเรียกใช้ Testacular พร้อมการบันทึกการแก้ไขข้อบกพร่องเพื่อดูว่ามีการโหลดสคริปต์ใดบ้าง (คุณสามารถดูสิ่งเดียวกันนี้ได้ในตัวตรวจสอบ):

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

angular.mock.injectเอกสารรวมถึงตัวอย่างที่สมบูรณ์สวย


อาจเป็นที่น่าสังเกตว่าmoduleตอนนี้ยังใช้งานได้กับมอคค่า
Robin-Hoodie

11

เราใช้ 'โมดูล' ที่ไม่มี 'เชิงมุม' ในการทดสอบหน่วยของเราและทำงานได้ดี

CoffeeScript:

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

ซึ่งรวบรวมถึง

JavaScript:

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

ครั้งเดียวที่ฉันเห็นบางอย่างเช่นข้อผิดพลาดที่คุณอธิบายคือถ้าในไฟล์ testacular.conf.js ไฟล์ angular-mocks.js ไม่อยู่ในส่วนไฟล์ก่อนข้อกำหนดที่พยายามใช้ 'โมดูล' ถ้าฉันใส่มันหลังจากการทดสอบในรายการ 'ไฟล์' ฉันจะได้รับ

ReferenceError: Can't find variable: module

(การทดสอบของเรากำลังดำเนินการผ่าน PhantomJS)


2
สิ่งที่จะสรุปได้คือ Angular-mocks เป็นข้อกำหนด
Adrien

3

ฉันได้รวม angular-mocks.js ไว้ใน config กรรมของฉันแล้ว แต่ก็ยังได้รับข้อผิดพลาด ปรากฎว่าลำดับมีความสำคัญในอาร์เรย์ไฟล์ (duh) เช่นเดียวกับในส่วนหัวของ html doc หากสคริปต์เรียกเชิงมุมก่อนที่จะกำหนดและเกิดข้อผิดพลาด ดังนั้นฉันต้องรวม app.js ของฉันไว้หลัง angular.js และ angular-mocks.js


0

หากคุณใช้ Yeoman และตัวสร้างเชิงมุมคุณอาจได้รับข้อผิดพลาดนี้ โดยเฉพาะอย่างยิ่งเมื่อคุณทำบทช่วยสอน (._.)
ฉันแก้ไขโดยการคัดลอกไฟล์ angular-mocks.js จาก bower_components / angular-mocks dir ไปยัง test / mock dir แน่นอนคุณต้องแน่ใจว่าไฟล์arma.conf.jsของคุณได้รับการกำหนดค่าอย่างถูกต้อง
ทักทาย!


0

var module = angular.module('my',[])ฉันมีปัญหาเดียวกันนี้เมื่อฉันได้ทำสิ่งที่ชอบ ฉันต้องการให้แน่ใจว่าล้อมรอบด้วย IIFE

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.