2016-03-24 19 views
1

Aşağıdaki Açısal servis ve alay/test kurulumuna sahibim. Sahte http isteğinin düzgün çalışmasını sağlayamıyorum. Fabrikamdan bir söz veriyorum ve HTTP isteğinin alay konusu olmasına karşın, denetleyicinin kapsamındaki veriler, fabrikada aranan http hizmetinden döndürülen veriler değil.Jasmine Mock for valans hizmetini kullanarak

Gördüğünüz gibi, $rootScope ve $httpBackend numaralı telefonlardan $digest()'u aradım. Kaybettim.

Klavyeden kodun düzgün şekilde çalıştığını ve metni hizmetten görüntülediğini görebilirsiniz, ancak sahte çalışmaz.

Neden?

keman

buradadır:

var myApp = angular.module('myApp', []); 
var ep = '/echo/json/'; 
myApp.factory('dataFactory', function($http) { 
    var getData = function() { 
    var data = $.param({ 
     json: JSON.stringify({ 
     name: "Name from Echo Service" 
     }) 
    }); 
    return $http.post(ep, data); 
    } 

    return { 
    getData: getData 
    } 
}); 

myApp.controller('MyCtrl', function($scope, dataFactory) { 
    $scope.name = 'Original Name'; 
    dataFactory.getData().then(function(data) { 
    $scope.name = data.data.name; 
    }); 
}); 

describe('Test For Site', function() { 
    beforeEach(angular.mock.module('myApp')); 
    var $controller; 
    var $httpBackend; 
    var $q; 
    var $rootScope; 
    beforeEach(angular.mock.inject(function(_$controller_, _$httpBackend_, _$q_, _$rootScope_) { 
    $controller = _$controller_; 
    $httpBackend = _$httpBackend_; 
    $q = _$q_; 
    $rootScope = _$rootScope_; 
    })); 

    describe('test pageController', function() { 
    it('Should pass', function() { 
     var scope = {}; 
     $httpBackend.expect('POST', ep); 
     $httpBackend.whenPOST(ep, function(str) { 
     return true; 
     }).respond(
     function() { 
      return { 
      name: "Name from Echo Service" 
      }; 
     }); 
     var controller = $controller('MyCtrl', { 
     $scope: scope, 
     }); 
     $httpBackend.flush(); 
     $rootScope.$digest(); 
     $rootScope.$flush(); 

     expect(scope.name).toBe('Name from Echo Service'); 
    }); 
    }); 
}); 

Burada HTML

<div ng-controller="MyCtrl"> 
    Hello, {{name}}! 
</div> 
<br/> 

cevap

1

bunu bulmak bir hayli zor oldu gerçekten dakikalık sorun olduğu görülüyor: https://jsfiddle.net/mbaranski/gnxxbgy3/ İşte kodudur. .whenPOST'un $httpBackend yalnızca object/string & değerini döndürerek, ..whenPOST yönteminin döndürdüğü bir işlevi döndürmeniz gerekir.

Sadece JSON döndürerek, function döndürerek yerine sorunu çözdü.

Kod

$httpBackend.whenPOST(ep, function(str) { 
    return true; 
}).respond({ 
    name: "Name from Echo Service" 
}); 

Ayrıca $rootScope.$flush(); bu hat kaldırın. $rootScope, $flush yönteminde yok.

Forked JSFiddle