2016-01-21 108 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调用移动到控制器,然后将所需的数据传递给过滤器。