कोणीय रिटर्न मॉड्यूल में परीक्षण सेवा परिभाषित नहीं है


127

मैं अपनी परियोजना में डिफ़ॉल्ट सेवा इकाई परीक्षण (GitHub पर कोणीय बीज परियोजना से लिया गया) चलाने की कोशिश कर रहा हूं, लेकिन मुझे "मॉड्यूल परिभाषित नहीं है" त्रुटि मिलती रहती है।

मैंने पढ़ा है कि यह संदर्भित जावास्क्रिप्ट फ़ाइलों के आदेश के साथ कुछ करना हो सकता है , लेकिन मुझे यह काम करने के लिए नहीं मिल सकता है, इसलिए उम्मीद है कि आप में से एक मदद करने में सक्षम हो सकता है।

परीक्षण के लिए मेरा विन्यास इस तरह दिखता है:

आधारपथ = '../';

files = [
'public / javascripts / lib / jquery-1.8.2.js',
'public / javascripts / lib / angular.js',
'public / javascripts / lib / angular- .js',
'public / app.js ',
' पब्लिक / कंट्रोलर्स /।
जेएस ',
' पब्लिक / डायरेक्टिव्स.जेएस ',
' पब्लिक / फिल्टर्स.जेएस ',
' पब्लिक / सर्विसेज.जेएस ',
JASMINE,
JASMINE_ADAPTER,
' पब्लिक / जेवरास्क्रिप्स / लिब / एंगुलर-मोक्स । js ',
' टेस्ट / यूनिट / *। js '];

ऑटोवाच = सत्य;

ब्राउज़र = ['क्रोम'];

junitReporter = {outputFile: 'test_out / unit.xml', सुइट: 'यूनिट'};

सेवा निम्नलिखित की तरह दिखती है:

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

और परीक्षण के माध्यम से परीक्षण चलाते समय त्रुटि यह है:

संदर्भ: मॉड्यूल परिभाषित नहीं है


2
क्या आप अपना प्रोजेक्ट कहीं साझा कर सकते हैं? मैं शायद मदद करने में सक्षम हो सकूं। क्या आपने यह देखने के लिए कि आपके विन्यास के आधार पर वास्तव में कौन सी फाइलें भरी हुई हैं, यह देखने के लिए DEBUG स्तर को चालू करने का प्रयास किया? अभी के लिए संदिग्ध हिस्सा यह संरक्षक है: सार्वजनिक / javascripts / lib / कोणीय -js - यह क्या मेल खाना चाहिए?
pkozlowski.opensource 21

@ जॉनडॉ धन्यवाद कि काम किया। यदि आप एक उत्तर जोड़ते हैं तो मैं इसे हल के रूप में चिह्नित करूंगा। कारण यह था कि मैं बीज परियोजना का पालन कर रहा था, जिसने इस तरह से किया, और जो काम किया। मुझे नहीं पता कि क्या यह है क्योंकि यह एक पूर्व संस्करण था।
डॉफ्स

@Dofs "" सार्वजनिक / javascripts / lib / कोणीय -js ', "और" सार्वजनिक / नियंत्रक / .js "टाइपोस हैं?
रियान ओ'नील

@ RyanO'Neill क्षमा करें, हाँ यह एक टाइपो था।
Dofs

जवाबों:


260

आप कोणीय-mocks.js फ़ाइल को याद कर रहे हैं ।


8
ध्यान दें कि angular.moduleऔर समान नहींangular.mock.module हैं । समारोह के लिए एक उपनाम है । इस उत्तर को और देखें window.moduleangular.mock.module
टिम शहाब

जैसा कि पिछली टिप्पणी कहती है, angular.module angular.mock.module का उपनाम नहीं है।
फिलिप्पो डी लुका

7
यदि यह उक्त फ़ाइल प्रदान करने के बारे में कोई सलाह देता है तो यह उत्तर अधिक उपयोगी होगा। मुझे Bower स्थापित करने की आवश्यकता थी, फिर NgMocks।
isherwood

4
उत्तर समाधान का केवल भाग प्रदान करता है। यह वास्तव में एक टिप्पणी है और स्पष्टीकरण नहीं है। नीचे दिए गए कुछ उत्तर बहुत अधिक विस्तृत हैं।
गेरोम बोचमन

1
शुरुआती के लिए, आपको फ़ाइल angular-mocksमें एक संदर्भ जोड़ना होगा karma.conf.js, और कर्मा के माध्यम से परीक्षण चलाना होगा, न कि जैस्मीन। इस तरह, जब कर्म चलाया जाता है, यह angular-mocksएक्सटेंशन को चुनता है और उन्हें पर्यावरण में शामिल करता है।
ल्यूक

41

मेरे पास एक ही समस्या थी, और मुझे समझ में आया कि यह क्यों काम नहीं कर रहा था: चमेली.जेएस जावास्क्रिप्ट को कोणीय-मॉकजेज फ़ाइल से पहले संदर्भित किया जाना चाहिए । वास्तव में, कोणीय- mocks.js जाँच करता है कि क्या जैस्मीन भरी हुई है, और केवल अगर यह है कि यह मॉड्यूल फ़ंक्शन को विंडो में जोड़ देगा।

यहाँ कोणीय मोक्स कोड का एक उद्धरण है:

('हैकिंग' के बारे में कुछ टिप्पणियों के बाद मुझे नीचे संपादित करें: यह कोड का केवल एक उद्धरण है, यह कुछ ऐसा नहीं है जिसे आपको खुद लिखने की ज़रूरत है, यह पहले से ही है!)

window.jasmine && (function(window) {

[...]

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

संक्षेप में: कोणीय-नकली और बंद होने से पहले अपने चमेली.जे का संदर्भ लें ।


यह भी सुनिश्चित करके हल किया जा सकता है कि चमेली जावास्क्रिप्ट फ़ाइलों को कोणीय-नकली से पहले लोड किया जाता है। काम करने के लिए सामान प्राप्त करने के लिए हैकी परिवर्तन करने की तुलना में क्लीनर समाधान।
फूमिप

@foomip हैकी परिवर्तन करने का सुझाव किसने दिया?
स्टीफन

आपने अनिवार्य रूप से यह सुनिश्चित करने के लिए अपने ऐप में एक हैक डाला है कि चीजें सही तरीके से लोड होती हैं - और मेरा मतलब है कि खराब तरीके से हैक नहीं किया गया (जिस तरह से आपने उस कोड को स्निपेट लिखा है, उसमें कुछ भी गलत नहीं है) लेकिन क्या होता है जब चमेली या कुछ और के लिए अद्यतन कि आपके स्निपेट को तोड़ने या अपेक्षा के अनुरूप कार्य करने का कारण बनता है? ऐसा हो सकता है या नहीं हो सकता है, लेकिन अब आपके कोड में यह दायित्व है कि इससे बचा जा सकता है, क्या आपको नहीं लगता?
फूमिप

@foomip: मुझे यकीन नहीं है कि आप किस बारे में बात कर रहे हैं, लेकिन अगर यह मेरे कोड के बारे में है, तो यह मेरे द्वारा नहीं लिखा गया था, मैं केवल इस मुद्दे को समझाने के लिए उद्धृत कर रहा हूं। कोड कोणीय-मोक्स का हिस्सा है। फिक्स बस एक फ़ाइल को दूसरे से पहले संदर्भित करने का मामला है।
एंटोनी जौसोइन

36

यह window.moduleफंक्शन कोणीय-मॉकजेज में आता है और इसके लिए एक शॉर्टहैंड है angular.mock.moduleडॉक्स में उल्लेख किया गया है , moduleफ़ंक्शन केवल जैस्मीन के साथ काम करता है।

Testdirectory का उपयोग करके , निम्न उदाहरण कॉन्फ़िगरेशन फ़ाइल लोड होगी 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 --log-level debug start config/testacular.conf.js

angular.mock.injectडॉक्स एक सुंदर पूर्ण उदाहरण शामिल हैं।


शायद यह ध्यान देने योग्य है कि moduleअब मोचा के साथ भी काम करता है
रॉबिन-हूडि

11

हम अपनी इकाई परीक्षणों में 'कोणीय' के बिना 'मॉड्यूल' का उपयोग करते हैं और यह ठीक काम करता है।

CoffeeScript:

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

जो संकलन करता है

जावास्क्रिप्ट:

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

केवल एक बार मुझे आपके द्वारा बताई गई त्रुटि की तरह कुछ दिखाई देता है, यदि testdirectory.conf.js फ़ाइल में कोणीय-मॉकजेज फ़ाइल को 'मॉड्यूल' का उपयोग करने की कोशिश कर रहे चश्मे से पहले फ़ाइल अनुभाग में सूचीबद्ध नहीं किया गया है। अगर मैं इसे 'फाइलों' की सूची में अपने परीक्षणों के बाद डालूं तो मुझे मिलेगा

ReferenceError: Can't find variable: module

(हमारे परीक्षण फैंटम जेएस के माध्यम से चलाए जा रहे हैं)


2
निष्कर्ष निकालने की बात कोणीय-मोक्स एक आवश्यकता है।
एड्रिएन

3

मैंने अपने कर्म विन्यास में कोणीय-मॉकजेज़ शामिल किया था, लेकिन अभी भी त्रुटि हो रही थी। यह पता चला है कि आदेश फ़ाइलों की सरणी में महत्वपूर्ण है। (duh) जैसे html डॉक के सिर में, यदि कोई स्क्रिप्ट परिभाषित होने से पहले कोणीय कहती है, और त्रुटि होती है। इसलिए मुझे सिर्फ अपना ऐप शामिल करना पड़ा। angs.js और कोणीय- mocks.js के बाद।


0

यदि आप येओमान और इसके कोणीय-जनरेटर का उपयोग कर रहे हैं, तो संभवतः आपको यह त्रुटि मिलती है। विशेष रूप से जब आप ट्यूटोरियल (._)
करते हैं, तो मैंने इसे ठीक किया, कोणीय-मॉकसेज फ़ाइल की प्रतिलिपि बनाकर, bower_compenders / angular-mocks dir से परीक्षण / mock dir तक। निश्चित रूप से आपको यह सुनिश्चित करना होगा कि आपकी karm.conf.js फ़ाइल सही रूप से कॉन्फ़िगर की गई है।
अभिवादन!


0

मेरे पास यही मुद्दा था जब मैं कुछ ऐसा कर रहा था var module = angular.module('my',[])। मुझे यह सुनिश्चित करने की आवश्यकता थी कि यह IIFE से घिरा हुआ था

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.