2016-03-29 23 views
1

ile geçirme İmzam işlevimin neden yasemin testimi geçmediğini anlayamıyorum. Ben $ httpBackend ile ilgili sorunlar angularjs belgelereTestimi, http iletisiyle birlikte jasmine

çok kötü olduğunu düşünüyorum Bu benim kodudur:

.controller('SystemControllerNg', 
    ['sweetAlertService', 'dataExchangeService', function(sweetAlertService, dataExchangeService) { 

    var self = this; 
    self.all_products = []; 

    /* 
     Get product from database 
    */ 
    self.getProductsFromDatabase = function() { 

     var success = function(response) { 
      self.all_products = response.data; 
     }; 

     var error = function(errResponse) { 
      console.log('Error getting products from database'); 
     }; 

     dataExchangeService.getProducts().then(success, error); 
    }; 
    /* 
     End get product 
    */ 

    /* 
     Send product to database 
    */ 
    self.sendProductToDatabase = function(type) { 
     var success = function(response) { 
      self.getProductsFromDatabase(); 
     }; 

     var error = function(errResponse) { 
      console.log('Error sending product to database'); 
     }; 

     dataExchangeService.sendProduct({ 
      "owner": 1, 
      "name": self.product_input, 
      "type": true, 
      "size": 0, 
      //"assign_category": self.categoryName_id 
      "assign_category": null 
     }).then(success, error); 
    }; 
    /* 
     End send product 
    */ 

    /* 
     Functions RUNNING in the background 
    */ 
     self.getProductsFromDatabase(); 
    /* 
     End functions RUNNING in the background 
    */ 
}]) 

.factory('dataExchangeService', ['$http', function($http) { 
    return { 
     getProducts: function() { 
      return $http.get('/api/v1/Products/'); 
     }, 
     sendProduct: function(dataObject) { 
      return $http.post('/api/v1/Products/', dataObject); 
     } 
    }; 
}]); 

ve testler kodu:

describe('Testing services in "Aplication" module', function() { 
    beforeEach(module('Aplication')); 

    describe('SystemControllerNg controller', function() { 

     var ctrl, mockBackend; 

     beforeEach(inject(function($controller, $httpBackend) { 
      mockBackend = $httpBackend; 

      ctrl = $controller('SystemControllerNg'); 
     })); 

     //In this issue everything is ok 
     it('it should load products from database', function() { 
      expect(ctrl.all_products).toEqual([]); 

      var resObj = { 
       "owner": 1, 
       "name": "", 
       "type": true, 
       "size": 0, 
       "assign_category": null 
      }; 

      mockBackend.expectGET('/api/v1/Products/') 
       .respond([ resObj ]); 

      mockBackend.flush(); 

      expect(ctrl.all_products).toEqual([ resObj ]); 
     }); 

     it('it should send product to database', function() { 
      //expect(ctrl.all_products).toEqual([]); 

      var dataObject = { 
       "owner": 1, 
       "name": "product", 
       "type": true, 
       "size": 0, 
       "assign_category": null 
      }; 

      //I don't know why can't pass it :| 
      mockBackend.expectPOST('/api/v1/Products/', dataObject).respond(201, {}); 

      mockBackend.flush(); 

      //expect(ctrl.all_products).toEqual([ dataObject ]); 
     }); 

     afterEach(function() { 
      mockBackend.verifyNoOutstandingExpectation(); 
      mockBackend.verifyNoOutstandingRequest(); 
     }); 
    }); 
}); 

İlk test expectGET İş büyüktür, ama neden bekliyoruzPOST değil? Neden işe yaramadığını biliyorsan çok minnettar olacağım. peşin console log

Teşekkür:

Bu benim günlük konsoludur. Burada

cevap

1

İki nokta:

1) testte POST olay gerçekleşmesi olacağını hizmetini çağırır denetleyici yöntemini çağırarak değildir. Eğer bir hizmet yöntemlerini çağıran bir denetleyicisi sınarken

it('it should send product to database', function() { 
     //expect(ctrl.all_products).toEqual([]); 

     var dataObject = { 
      "owner": 1, 
      "name": "product", 
      "type": true, 
      "size": 0, 
      "assign_category": null 
     }; 

     //I don't know why can't pass it :| 
     mockBackend.expectPOST('/api/v1/Products/', dataObject).respond(201, {}); 
     //this is missing from your test 
     ctrl.sendProductToDatabase(); 

     mockBackend.flush(); 
     scope.$digest(); 

     expect(ctrl.all_products).toEqual([ dataObject ]); 
    }); 

2), hizmeti alay ve test kurulumu sırasında denetleyici enjekte olmalıdır. Kontrolör için yaptığınız testler, servisin ne yaptığını değil, kontrolörün ne yaptığını test etmelidir. Hizmetlerinizi bağımsız olarak test edin.

+0

1) Teşekkürler, ama daha önce de ctrl.sendProductToDatabase(); 'denedim ve hala işe yaramadı. Bunun en mantıklı çözüm olduğunu biliyorum .. 2) Muhtemelen haklısın ve ben de deneyeceğim, ama benim için bir anlam ifade etmiyor, çünkü eğer bir çözüm olursa o zaman: 'mockBackend.expectGET ('/ api/v1/Ürünler/') yanıt ver ([resObj]); 'ayrıca işe yaramaz mı? –

+0

Sürecine özet döngüsü eklediniz mi? Cevabıma eklediğim şeye benzer bir şey. İlk önce test ayarınızda kapsam değişkenini tanımlamanız gerekir. – MBielski

+0

Yardımcı olmadı, ama ünite testlerinin angulajlarda nasıl çalıştığını yanlış anladım. Yardımın için çok teşekkürler. Bunu doğru yaptığım zaman çözümüme yazacağım –