2014-10-27 13 views
6

के साथ इकाई परीक्षण $ मोडल मेरे पास एक नियंत्रक के साथ एक कोणीय ऐप है जो फ़ंक्शन कॉल के दौरान Angular-Strap मोडल विंडो प्रदर्शित करता है। यह क्रोम में सही ढंग से काम करता है, लेकिन मुझे एक वैध इकाई परीक्षण काम करने में कमी आई है।जैस्मीन

अनुप्रयोग मॉड्यूल और FooController:

var app = angular.module("app", ["mgcrea.ngStrap"]); 

app.controller("FooController", function($scope, $modal) { 
    var fooModal = $modal({ 
     title: 'Foo', 
     content:'Bar', 
     show: false, 
     html: true, 
     backdrop: 'static', 
     placement: 'center'}); 

    angular.extend($scope, { 
     makeItFoo: function() { 
      fooModal.show(); 
     } 
    }); 
}); 

नियंत्रक कल्पना:

describe('FooController', function() { 
    var scope, controller, modal; 

    beforeEach(module('app', function ($provide) { 
     // Stub out $modal service 
     $provide.value('$modal', function() { 
      return { 
       hide: function() { }, 
       show: function() { } 
      }; 
     }); 
    })); 

    beforeEach(inject(function ($rootScope, $controller, $injector) { 
     //set up a new scope and the controller for the test 
     scope = $rootScope.$new(); 
     controller = $controller('FooController', {$scope: scope}); 
     modal = $injector.get('$modal'); 
    })); 

    it('should show the modal', function() { 
     var modalSpy = spyOn(modal(), 'show'); 

     scope.makeItFoo(); 

     expect(modalSpy).toHaveBeenCalled(); 
    }); 
}); 

Here's a fiddle as well.

मैं मोडल प्रदर्शित करने के लिए makeItFoo() करने के लिए अपने कॉल की उम्मीद है, लेकिन जैस्मीन विफल रहता हैत्रुटि के साथ परीक्षण। मैंने show को true पर मॉडल की संपत्ति को सेट करने का प्रयास किया है और show() को अलग से कॉल नहीं किया है, और मैंने $ मोडल सेवा को दबाकर और इसे सीधे नियंत्रक में इंजेक्शन देने के अन्य रूपों की कोशिश की है, लेकिन यह एक ही त्रुटि के साथ समाप्त होता है।

मैं AngularJS 1.2.14, कोणीय-स्ट्रैप 2.0.0, और जैस्मीन 1.3.1 का उपयोग कर रहा हूं।

उत्तर

7

इन करने के बजाय। $modal के लिए शो और छुपाएं विधियों के साथ एक मॉक ऑब्जेक्ट बनाएं और उन पर अपनी अपेक्षाएं सेट करें।

describe('FooController', function() { 
    var scope, controller, modal; 

    beforeEach(module('app')); 

    beforeEach(inject(function ($rootScope, $controller) { 
     //set up a new scope and the controller for the test 
     scope = $rootScope.$new(); 
     //Create spy object 
     modal = jasmine.createSpyObj('modal', ['show', 'hide']); 
     //provide modal as dependency to the controller. 
     controller = $controller('FooController', {$scope: scope, $modal:modal}); 

    })); 

    it('should show the modal', function() { 

     scope.makeItFoo(); 

     expect(modal.show).toHaveBeenCalled(); 
    }); 
}); 
+1

जब आप इसे पोस्ट करते हैं तो मैं अपना जवाब मध्य में था, आपने इसे दबाया;) – maurycy

+0

@ मॉरीसी हाहा यह कभी-कभी मेरे साथ भी होता है .. :) – PSL

+0

@PSL, धन्यवाद! मैं $ modal नकली करने के सही तरीके को समझने की कोशिश कर रहा था, और ऐसा लगता है। हालांकि, जैसा कि आपने वर्णन किया है, मेरी पहेली को अपडेट करने के बाद, परीक्षण अभी भी विफल रहा है। विशेष रूप से, त्रुटि अब 'तर्क' FooController 'पढ़ती है एक फ़ंक्शन नहीं है, अपरिभाषित हो गया है; अद्यतन पहेली [यहां] (http://jsfiddle.net/dimmreaper/jwom7ns2/3/)। –

1

मोडल शो async है। मैंने http://jsfiddle.net/jwom7ns2/1/ पर अपना बेवकूफ अपडेट किया।

बदलें निम्नलिखित भाग: जब मोडल शो होता है

डाइजेस्ट के लिए
it('should show the modal', function (done) { 
    var modalSpy = spyOn(modal(), 'show'); 

    scope.makeItFoo(); 

    setTimeout(function() { 
     expect(modalSpy).toHaveBeenCalled(); 
     done(); 
    }); 

}); 

टाइमआउट आवरण प्रतीक्षा करता है तो होना ही।

+0

मैं आपके जवाब को संशोधित करने से पहले टिप्पणी करने वाला था क्यों 'स्कोप। $ आवेदन'? लेकिन मुझे लगता है कि यह शायद एक ओवरकिल आईएमएचओ है, क्योंकि ओपी ने पहले से ही एक नकली ओबीजे बनाया है और फिर जासूसी स्थापित कर रहा है। इसके बजाए सभी को चमेली का उपयोग करके एक मॉक ऑब्जेक्ट बनाकर एक बार किया जा सकता है। इसके अलावा आपको वास्तव में '$ injector.get ('$ modal') करने की आवश्यकता नहीं है, बल्कि' $ modal' को सीधे इंजेक्शन दिया जा सकता है। – PSL

+1

धन्यवाद, यह निश्चित रूप से व्यवहार्य समाधान की तरह लगता है। मैं @ पीएसएल के $ मोडल का मज़ाक लगाने की विधि को पहले शॉट देने जा रहा हूं, क्योंकि मैं समय के साथ स्पष्ट रूप से निपटना नहीं चाहता हूं। अगर मुझे वहां परेशानी है, तो मैं आपके समाधान को ध्यान में रखूंगा। धन्यवाद! –