2015-05-20 94 views
0

我測試了一個控制器,它有一個方法從我的服務器返回一個json對象。我真的很困惑如何對我的方法返回的期望。

我需要根據結果對我的範圍進行一些清理。

我想要完成的是調用search() - >查看返回的數據是什麼 - >以及如果長度== 0 - >確保我的範圍已刪除某些值。我怎樣才能檢查我的方法已返回?

$scope.clearIds = function(){ 
    //clean out data I don't need anymore 
    } 

    $scope.search = function(inputValue, modelname, action, field){ 
    modelname = modelname || 'companies'; 
    action = action || 'search'; 
    field = field || 'title'; 

    return apiResource.query({api_resource:modelname, api_action:action, api_column:field, api_value:inputValue}).$promise.then(function(response){ 
    if(response.data.length === 0){ 
     $scope.clearIds(); 
    } 
    else{ 
     return response.data; 
    } 
    }); 
    } 

    describe('Controller - TypeaheadSearch', function() { 

    // load the controller's module 
    beforeEach(module('app')); 

    var scope; 
    var apiResource; 
    var stateParams; 
    var q; 
    var deferred; 
    var rootScope; 

    // Initialize the controller and a mock scope 
    beforeEach(inject(function ($controller, $rootScope, $q) { 

     apiResource = { 
     query: function() { 
      deferred = $q.defer(); 
      deferred.resolve('bar'); 
      return deferred.promise; 
     } 
     }; 
     scope = $rootScope.$new(); 
     stateParams = {}; 
     q = $q; 
     rootScope = $rootScope; 
     $controller('TypeaheadSearch', { 
     $scope: scope, 
     $stateParams:stateParams, 
     apiResource: apiResource, 
     }); 
    })); 

    it('Should call apiResource:query', function() { 

     spyOn(apiResource, 'query').and.callThrough(); 
     scope.search(); 
     rootScope.$apply(); 
     expect(apiResource.query).toHaveBeenCalled(); 
    }); 
    }); 
+0

更簡單的你可以做'apiResource = jasmine.CreateSpyObj('apiresource',['query']); apiResource.query.and.returnValue($ q.when(expectedQueryValue));' – PSL

回答

0

創建$ scope.clearIds間諜(),然後expect(scope.clearIds).toHaveBeenCalled(),和/或檢查clearIds()已經有你想要的效果。

接下來,用類似於您的代碼所期望的數據來解決假承諾。 在您的(it())測試中執行此操作,以便您可以看到代碼如何響應不同的數據(例如,返回包含某些數據的數組)。

deferred.resolve({data: []}); 
+0

好吧然後我的下一個問題是如何不必重寫beforeEach塊只是爲了改變傳入的解析數據?我只是將它嵌套並重復整個每個塊之前的事情? 另外我想我正在閱讀的是 - **返回回送的數據無關緊要。我們已經知道了。什麼是重要的是代碼與我們發送的假數據做的事情。** 對不對? –

+0

爲什麼你需要在每個塊之前重寫整個?只需將那個「deferred.resolve()」行移入您的測試。 即使你確實需要在你的測試中再次運行所有的代碼,JS也有這些叫做函數的瘋狂的東西,它們使代碼重複成爲不必要的。 – HankScorpio

+0

這對你的代碼處理假數據有影響,但是如果你的代碼在'response.data'處檢查數組的長度,而不是你給它一個字符串,那麼你怎麼能期待測試有意義?誰告訴你這些數據並不重要? – HankScorpio