AngularJS-$ httpBackend के माध्यम से डेटा का मजाक उड़ा रहा है?



unit-testing jasmine (1)

आपको किसी तरह के बीच अंतर करना होगा:

  • इकाई परीक्षण
  • एकीकरण परीक्षण
  • एंड-टू-एंड टेस्ट

आप चाहते हैं कि यूनिट को getData () फ़ंक्शन का परीक्षण करें। मैं मानता हूं कि अगर इस मामले में डेटा सही है या नहीं, तो आपको परवाह नहीं है। आप क्या परीक्षण करना चाहते हैं , अगर सही यूआरएल को मिल रहा है

तो आप सुनिश्चित कर रहे हैं कि आपके कोड की यह इकाई अपेक्षित रूप में काम कर रही है

इस उदाहरण को लें:

var add = function(endpoint) {
  var sum = 0;
  endpoint().then(function(numberArray) {
    numberArray.forEach(number) {
      sum = sum + number;
    }
   });

   return sum;
}; 

जब आप यहां httpBackend का नकली करते हैं, तो आप वास्तव में परवाह नहीं करते हैं कि आपको 1,2,3 या 5,6,7 बैक में मिलता है। आप यह सुनिश्चित करना चाहते हैं कि आप जितनी भी संख्या आए, आप उन्हें जोड़ दें और उन्हें वापस लौटें।

आपका केस बहुत सरल है, इसलिए आप जांच सकते हैं कि यूआरएल सही है, और यही है।

एक एंड-टू-एंड टेस्ट में एक उचित बैकएंड भी शामिल होगा और अगर डेटा ठीक है तो यह जांचता है।

AngularJS प्रलेखन यह स्पष्ट बनाता है:

 it('should fetch authentication token', function() {
   $httpBackend.expectGET('/auth.py');
   var controller = createController();
   $httpBackend.flush();
 });

इस उदाहरण में, आप यह सुनिश्चित करना चाहते हैं कि आप सही यूआरएल / समापन बिंदु फोन कर रहे हैं। यदि आप वास्तव में सही टोकन प्राप्त करते हैं, तो एक एकीकरण परीक्षण या एंड-टू-एंड टेस्ट अधिक उपयुक्त होता है जो वास्तविक बैकएंड को कॉल करता है।

मैंने जैस्मीन के माध्यम से अपना पहला यूनिट परीक्षण AngularJS में लिखना शुरू किया

किसी भी तरह मैं अभी भी समझ में नहीं आया कि मुझे $ httpBackend का नकली कारण होना चाहिए। जो अभी भी अस्पष्ट है उसे स्पष्ट करने के लिए मैं एक छोटा सा उदाहरण लिखूंगा:

कल्पना कीजिए कि मेरे पास एक सेवा (माइस्वाइव) है जो किसी URL से डेटा प्राप्त कर रही है:

 function getData() {
    return $http.get("http://example.com/data")
       .then(function (response) {
          return response.data;
        });
 }

मान लीजिए कि " http://example.com/data " यूआरएल के लिए एक जीईटी कॉल निम्न डेटा देता है:

{
    firstname: "John",
    lastname: "Doe"
}

संबंधित परीक्षण इस तरह दिखेंगे:

describe("Service: myService", function () {

    beforeEach(module("myApp"));

    var myService, $httpBackend;

    beforeEach(inject(function (_myService_, _$httpBackend_) {
        myService = _myService_;
        $httpBackend = _$httpBackend_;
    }));

    afterEach(function () {
        $httpBackend.verifyNoOutstandingExpectation();
        $httpBackend.verifyNoOutstandingRequest();
    });

    it("should get data", function() {
        var mockData = {datakey: "datavalue"};
        $httpBackend.whenGET("http://example.com/data").respond(mockData);

        var promise = myService.getData();
        $httpBackend.flush();

        promise.then(function(response){
            expect(response).toEqual(mockData)
        });
    })
});

जब तक मैं ग़लत नहीं हूं, परीक्षण पास होना चाहिए, हालांकि नकली डेटा असली डेटा के बराबर नहीं है। परीक्षण हमेशा पास होगा, चाहे कितना भी मैंने मॉकडेट को सेट किया हो, क्योंकि सेवा फ़ंक्शन हमेशा $ httpBackend.whenGET (" http://example.com/data ") में निर्धारित की गई है।

मैंने सोचा कि इस तरह के एक परीक्षण का उद्देश्य यह है कि क्या गेट कॉल से लौटा हुआ डेटा [इस मामले में myService.getData () ] वास्तव में अपेक्षित आंकड़े हैं और कुछ यादृच्छिक बेमेल डेटा नहीं है तो क्या डेटा की उपेक्षा करने का वास्तविक बिंदु यह है कि अगर myService.getData वास्तविक डेटा देता है {firstname: "John", lastname: "Doe"} ?

मुझे अच्छी तरह पता है कि मैं मस्त डेटा को {firstname: "John", lastname: "Doe"} के लिए सेट भी कर सकता हूं, लेकिन जब यूआरएल का वास्तविक डेटा गतिशील होगा, मॉकडेट और असली डेटा नहीं होगा फिर से बराबर हो

आपका अग्रिम में ही बहुत धन्यवाद!





httpbackend