2016-01-21 107 views
0

我正在嘗試測試我構建的自定義過濾器。我遇到的問題是這個過濾器依賴於通過服務的異步調用。下面是我的相關過濾代碼在前,我目前的測試:單元測試依賴於服務的角度過濾器

.filter('formatValue', ['serverService', '_', function(serverService, _) { 
    var available = null; 
    var serviceInvoked = false; 

    function formatValue(value, code) { 
    var details = _.findWhere(available, {code: code}); 
    if (details) { 
     return details.unitSymbol + parts.join('.'); 
    } else { 
     return value; 
    } 
    } 

    getAvailable.$stateful = true; 
    function getAvailable(value, code) { 
    if (available === null) { 
     if (!serviceInvoked) { 
     serviceInvoked = true; 
     serverService.getAvailable().$promise.then(function(data) { 
      available = data; 
     }); 
     } 
    } else { 
     return formatValue(value, code); 
    } 
    } 
    return getAvailable; 
}]) 

測試:

describe('filters', function() { 

    beforeEach(function() { 
    module('underscore'); 
    module('gameApp.filters'); 
    }); 

    beforeEach(module(function($provide) { 
    $provide.factory('serverService', function() { 
     var getAvailable = function() { 
     return { 
      // mock object here 
     }; 
     }; 
     return { 
     getAvailable: getAvailable 
     }; 
    }); 
    })); 

    describe('formatValue', function() { 

    it('should format values', inject(function(formatValueFilter) { 
     expect(formatValueFilter(1000, 'ABC')).toEqual('å1000'); 
    })); 
    }); 
}); 

運行我的測試中,當我遇到的錯誤是:

TypeError: 'undefined' is not an object (evaluating 'serverService.getAvailable().$promise.then') 

回答

0

你的模擬服務需要返回已解決的承諾。你可以通過注入$ q並返回$q.when(data)

這樣做,但是我會考慮重新構造這個過濾器。過濾器旨在快速計算,並且可能不應該依賴於異步調用。我建議將你的http調用移動到控制器,然後將所需的數據傳遞給過濾器。