2014-11-03 205 views
0

我正在嘗試編寫茉莉花單元測試來測試角度控制器,並遇到已注入服務並返回承諾的問題。嘲笑茉莉花承諾

我有一種從服務器獲取數據的服務:

app.factory('LookupService', ['$resource', '$http', '$cookies', 
function ($resource, userId) { 
    return $resource('./Controller/GetFunction', {}, { 
     query: { method: 'GET', params: { userId: userId }, isArray: true } 
    }); 
}]); 

被稱爲控制器:

$scope.returnedDataStore = lookupService.get({ userId: $scope.userId }); 
$scope.returnedDataStore.$promise.then(function (result) { 
    $scope.processData(result.data); 
}); 

在我的單元測試,我下面注入該服務:

beforeEach(function() { 
    module('app'); 

    lookupService = jasmine.createSpyObj('LookupService', ['get']); 

    inject(function ($rootScope, $controller, $q) { 
     $scope = $rootScope.$new(); 

     var deferred = $q.defer(); 
     lookupService.get.and.returnValue(deferred.promise); 

     ctrl = $controller('myController', { 
      $scope: $scope, 
      LookUpService: lookupService 
     }); 
    }); 
}); 

但是,當在控制器中調用服務時,我收到一個錯誤,指出錯誤阿泰說$scope.returnedDataStore.$promise未定義:未定義

我已經搜查了很多試圖解決這個問題,但我並沒有多少運氣

無法讀取屬性「然後」。

如果有人能指出我正確的方向,我會非常感激!

回答

0

我通常做的是 - 在服務

手柄承諾並返回承諾對象控制器,看看它有助於您:

describe('Controller: mainCtrl', function() { 
    beforeEach(module('myApp')); 

    var mainCtrl, 
     scope, 
     someService, 
     spyGetSomething; 


    beforeEach(inject(function($controller, $rootScope) { 
     someService = { 
      getSomething: function() {} 
     }; 

     spyGetSomething = spyOn(someService, 'getSomething').andReturn({ 
      then: function() {} 
     }); 

     mainCtrl = $controller('mainCtrl', { 
      $scope: scope, 
      SomeService: someService 
     }); 
    }); 
    ... 

    it('Should call SomeService.getSomething() ', function() { 
     expect(spyGetSomething).toHaveBeenCalled(); 
    }); 


}); 

(注:沒有測試)

+0

謝謝!我設法通過嘲笑承諾對象,如上所述。以供將來參考我的代碼,原先爲: lookupService.get.and.returnValue({ \t \t \t \t $承諾: \t \t \t \t { \t \t \t \t \t則:函數(){ \t \t \t \t \t \t \t \t \t \t \t} \t \t \t \t} \t \t \t}); – Loki 2014-11-03 12:32:59