2013-05-15 17 views
9

जब मैं कोणीयजेएस + कर्म के साथ काम कर रहा हूं तो एक नकली सेवा का पुन: उपयोग करें। configService मेरे ऐप की सेटिंग्स का प्रबंधन करता है (उदा। पृष्ठभूमि-रंग, यह डीबग मोड पर सामान्य है, सामान्य अनुमतियां ...)। यह $ http के साथ प्रारंभिक डेटा लोड करता है। मैंने सेवा के लिए सफलतापूर्वक परीक्षा लिखी लेकिन मेरे निर्देश और नियंत्रक इसका इस्तेमाल करते हैं।कोणीयजेएस + कर्म: यूनिट परीक्षण निर्देश या नियंत्रक

जब मैं निर्देशों के लिए यूनिट परीक्षण लिखता हूं, तो मुझे सेवा का मज़ाक उड़ाना पड़ता है।

मैं जानता हूँ कि मैं कर सकते हैं:

spyOn(configService, 'getBackgroundColor').andCallFake(function (params) { 
    return "red"; 
}); 

लेकिन सेवा 25+ तरीकों और प्रारंभिक डेटा लोड है। मुझे इस टेस्ट सूट में इस जासूसी को लिखने (और बनाए रखने) की तरह महसूस नहीं होता है। और भी, मैं कारखाने में $ http के साथ डेटा लोड करता हूं, और इसे भी मजाक किया जाना चाहिए। अगर मैं सिर्फ सेवा इंजेक्ट करता हूं और कॉल का मज़ाक उड़ाता हूं, तो भी मैं http को अनुरोध प्राप्त करूंगा।

आपको क्या लगता है कि नकली पुन: उपयोग करने का सबसे अच्छा तरीका होगा?

+0

क्या आप बस कई परीक्षणों के बीच सेवा का एक मॉक साझा करना चाहते हैं? या आप $ http कॉल का नकल करने और अपने निर्देश और नियंत्रक परीक्षण में सेवा का उपयोग करने का एक तरीका ढूंढ रहे हैं? –

+0

कई परीक्षण सूटों के बीच सेवा के मॉक साझा करें। अधिक विशेष रूप से, प्रत्येक() से पहले एक लंबे समय से प्रतिलिपि बनाने से बचें। कल मैंने मॉड्यूल 'myapp.mocks' में एक सेवा बनाई और इसे testacular.conf.js में शामिल किया, और फिर मैं इसे' मॉड्यूल (myapp.mocks) 'के साथ लोड करता हूं। मैंने अपने सर्वर की प्रतिक्रिया को दूसरी फ़ाइल में भी निकाला और 'var RESPONSE_SERVER = {json here}' बनाया। अगर यह एक अच्छा समाधान की तरह लगता है तो मैं और अधिक विस्तृत करूंगा और –

+1

से नीचे जवाब दूंगा जो कि मैं सिफारिश करने जा रहा था। मैंने एक .js फ़ाइल बनाई है जिसमें सिर्फ एक सादा पुराना जावास्क्रिप्ट फ़ंक्शन है जिसे मैंने नकली बनाने के लिए बुलाया था। परीक्षण के लिए सर्वर प्रतिक्रियाओं को कॉन्फ़िगर करने के लिए एक और सादा पुराना जावास्क्रिप्ट फ़ंक्शन।और जैसा कि आप कहते हैं, यदि आप जेएसएन प्रतिक्रियाओं के साथ एक वैश्विक चर परिभाषित करते हैं तो आप इसके परीक्षणों के साथ तुलना करने के लिए इसका उपयोग कर सकते हैं। –

उत्तर

0

मैंने एक .js फ़ाइल बनाई है जिसमें अभी एक सादा पुराना जावास्क्रिप्ट फ़ंक्शन है जिसे मैंने नकली बनाने के लिए बुलाया था। परीक्षण के लिए सर्वर प्रतिक्रियाओं को कॉन्फ़िगर करने के लिए एक और सादा पुराना जावास्क्रिप्ट फ़ंक्शन। और अगर आप की तरह कहते हैं, अगर आप json प्रतिक्रियाओं के साथ एक वैश्विक चर को परिभाषित तो आप उपयोग कर सकते हैं कि आपके परीक्षण में

8

के खिलाफ तुलना करने के लिए इसके बजाय जासूस के साथ परीक्षण कोड छिड़काव की आप में सेवा करने का एक उचित नकली बना सकते हैं इसका अपना मॉड्यूल और इसे किसी भी परीक्षण में जोड़ना चाहिए जिसकी आवश्यकता है।

नियंत्रक इकाई परीक्षण एक परीक्षण/spec/मॉड्यूल/उपयोगकर्ता/नियंत्रक.जेएस फ़ाइल में बैठता है।

मजाक सेवा एक परीक्षण/नकली/मॉड्यूल/उपयोगकर्ता/service.js फ़ाइल में बैठती है।

एक नियंत्रक विधि के लिए:

$scope.refreshList = function() { 
    UserService.all(pageNumber, size, sort, function(data) { 
    $scope.users = data.content; 
    $scope.page = data.page; 
    }); 
}; 

मज़ाक उड़ाया सेवा:

(function() { 

'use strict'; 

angular.module('app.user.mock', ['app.user']); 

angular.module('app.user.mock').factory('UserServiceMock', 
    ['$q', 
    function($q) { 
    var factory = {}; 

    factory.mockedUsers = { 
     content: [ { firstname: 'Spirou', lastname: 'Fantasio', email: '[email protected]', workPhone: '983743464365' } ], 
     page: '1' 
    }; 

    factory.search = function(searchTerm, page, size, sort, callback) { 
     var defer = $q.defer(); 
     defer.resolve(this.mockedUsers); 
     defer.promise.then(callback); 
     return defer.promise; 
    }; 

    factory.all = function(page, size, sort, callback) { 
     var defer = $q.defer(); 
     defer.resolve(this.mockedUsers); 
     defer.promise.then(callback); 
     return defer.promise; 
    }; 

    return factory; 
    } 
]); 

})(); 

और नियंत्रक इकाई परीक्षण:

(function() { 

'use strict'; 

var $scope; 
var listController; 
var UserServiceMock; 

beforeEach(function() { 
    module('app.project'); 
    module('app.user.mock'); // (1) 
}); 

beforeEach(inject(function($rootScope, _UserServiceMock_) { 
    $scope = $rootScope.$new(); 
    UserServiceMock = _UserServiceMock_; // (2) 
})); 

describe('user.listCtrl', function() { 

    beforeEach(inject(function($controller) { 
    listController = $controller('user.listCtrl', { 
     $scope: $scope, 
     UserService: UserServiceMock 
    }); 
    })); 

    it('should have a search function', function() { // (3) 
    expect(angular.isFunction(UserServiceMock.search)).toBe(true); 
    }); 

    it('should have an all function', function() { 
    expect(angular.isFunction(UserServiceMock.all)).toBe(true); 
    }); 

    it('should have mocked users in the service', function() { 
    expect(UserServiceMock.mockedUsers).toBeDefined(); 
    }); 

    it('should set the list of users in the scope', function(){ 
    expect($scope.users).not.toEqual(UserServiceMock.mockedUsers); 
    $scope.refreshList(); 
    $scope.$digest(); 
    expect($scope.users).toEqual(UserServiceMock.mockedUsers.content); 
    }); 

}); 

})(); 

आप युक्त app.user.mock मॉड्यूल जोड़ने मजाक सेवा (1) और नियंत्रक (2) में मजाक सेवा इंजेक्षन।

फिर आप अपनी मॉक सेवा को इंजेक्शन (3) परीक्षण कर सकते हैं।

+0

क्या आप इस तरह के नकली में जैस्मीन को पाने के किसी भी तरीके से जानते हैं? ताकि मैं हाथ से कॉल ट्रैक करने के बजाय 'jasmine.spyOn' का उपयोग कर सकूं। – dshepherd

संबंधित मुद्दे