2016-03-24 11 views
1

以下の角度サービスとモック/テスト設定があります。私はモックhttp要求を正しく動作させることができません。私は工場から約束を返して、HTTPリクエストを嘲笑させますが、コントローラのスコープ内のデータは、工場が呼び出すHTTPサービスから返されたデータではありません。ジャスミンモック(角度サービス用)

ご覧のとおり、$digest()$rootScope$httpBackendにあります。私は迷っている。

コードが正しく動作し、サービスのテキストが表示されますが、モックは機能していないことがわかります。

なぜですか?

フィドルはここにある:ここではhttps://jsfiddle.net/mbaranski/gnxxbgy3/ はコードです:

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'); 
    }); 
    }); 
}); 

はここでHTML

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

答えて

1

だ私はそれを見つけるために多くのことを取っ本当に分の問題でした。 の.whenPOSTobject/string &のうち.respondから返された関数を返していただけです。..whenPOSTメソッドです。

普通のJSONを返すだけで、functionを返すのではなく、問題を解決しました。

コード

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

また$rootScope.$flush();この行を削除してください。 $rootScopeには$flushメソッドがありません。

Forked JSFiddle