12

मान लीजिए मैं एक सेवा है जो $ rootScope में एक मूल्य पर निर्भर करता है, तो निम्न (तुच्छ) सेवा के साथ है:

angular.module('myServices', []) 
.factory('rootValGetterService', function($rootScope) { 
    return { 
     getVal: function() { 
      return $rootScope.specialValue; 
     } 
    }; 
}); 

अगर मैं $ rootScope में एक मूल्य रख कर इकाई परीक्षण करना चाहते हैं यह, क्या है इसके बारे में जाने का सबसे अच्छा तरीका?

उत्तर

6

) प्रदान का उपयोग कर (, आप एक नया $ rootScope इंजेक्षन कर सकते हैं द्वारा:

describe('in rootValGetter', inject(function ($rootScope) { 
    var scope; 
    var testRootValGetter; 

    beforeEach(function() { 

     scope = $rootScope.$new(); 

     module(function ($provide) { 
      $provide.value('$rootScope', scope); 
     }); 

     inject(function ($injector) { 
      testRootValGetterService = $injector.get('rootValGetterService'); 
     }); 
    }); 

    it('getVal returns the value from $rootScope', function() { 
     var value = 12345; 

     scope.specialValue = value; 

     expect(testRootValGetterService.getVal()).toBe(value); 
    } 
} 
+12

यह पैटर्न मेरे लिए काम नहीं कर रहा है। कोणीय इस त्रुटि को फेंकता रहता है: "त्रुटि: इंजेक्टर पहले ही बनाया गया है, मॉड्यूल पंजीकृत नहीं कर सकता!" – Espilon

+0

आपको 'scope = $ rootScope का उपयोग करने की आवश्यकता क्यों है। $ New();', '$ rootScope' का उपयोग करने के बजाय सीधे? –

+1

क्योंकि मैं एक-दूसरे से अलग यूनिट परीक्षणों को चलाने के लिए चाहता हूं। –

3

शामिल angular-mocks.js, तो angular.mock.inject का उपयोग करें:

+1

दस्तावेज़ों का लिंक पुराना है; वर्तमान लिंक है: https://docs.angularjs.org/api/ngMock/function/angular.mock.inject –

+0

@ ग्रेगरी एवरी-वीर धन्यवाद! सही। – L42y

21
... 
var $rootScope; 
beforeEach(inject(function(_$rootScope_) { 
    $rootScope = _$rootScope_; 
})); 
... 
+0

क्या यह आपको हर टेस्ट के लिए एक ही गुंजाइश नहीं देता है? आप सेवा के लिए एक नया नया दायरा कैसे पारित करते हैं? – Tamlyn

+0

हाय टैमलीन, आपकी रूट स्कोप अब किस तरह से ताजा नहीं है? मैं मान लीजिए कि मैंने कभी भी घटनाओं को प्रसारित करने के लिए इसका इस्तेमाल किया है। –

+1

अंडरस्कोर की आवश्यकता है क्योंकि अन्यथा बंद होने में '$ rootScope' और' $ rootScope' तर्क के बीच नामकरण संघर्ष है। –

0

बस परीक्षण सहित अधिक विस्तृत जवाब देने की कोशिश मामला:

...

var $rootScope; 
beforeEach(inject(function(_$rootScope_) { 
    $rootScope = _$rootScope_; 
})); 

...

it('getVal returns the value from $rootScope', function() { 
     var value = 12345; 
     $rootScope.specialValue = value; 
     expect(testRootValGetterService.getVal()).toBe(value); 
    } 
0

यहाँ मैं क्या किया है:

it('some kind of wacky test', function($rootScope, Translate){ 
    $rootScope.lang = 'en'; 
    expect(Translate('overview').toBe('Overview'); 
} 
0

आशा इस दूसरों में मदद करता है के रूप में इस के लिए एक समान समस्या का समाधान किया गया।

var rootValGetterService; 

beforeEach(inject(function($rootScope,$injector) { 
    $rootScope.specialValue = "test"; 
    rootValGetterService= $injector.get('rootValGetterService'); 
})); 

it("Should have a service", function() { 
    expect(rootValGetterService).toBeDefined(); 
}); 
0

इसके बजाय एक नया गुंजाइश बनाने के रूप में आप अगर तुम इंजेक्शन थे $scope आप गुण नकली कर सकते हैं की आप $rootScope में सीधे की जरूरत है।

फिर $rootScope आपके द्वारा परीक्षण किए जा रहे कोड में उपलब्ध उन गुणों के साथ इंजेक्शन दिया जाएगा।

कम से कम इस तरह से मैंने एक ही समस्या हल की है।

निम्नलिखित कोड आपके उदाहरण में काम करना चाहिए।

beforeEach(inject(function($rootScope) { 
    $rootScope.specialValue = 'whatever'; 
})); 
संबंधित मुद्दे