测试使用另一个使用$ http的服务的角度服务

时间:2014-12-02 17:12:36

标签: angularjs http mocking jasmine promise

我已经写了两个角度服务。

一个名为“searchAPI”,它基本上接受用户输入,形成弹性搜索查询,然后通过$ http.get调用将其关闭。

//searchAPI

service = {
    executeSearch: function(input, resultsPerPage, pageNumber){
        request = // some well tested logic that I know works to create a query string
        return $http.get(request);
    }
}

另一个叫做typeAhead,它使用我的searchAPI来获取typeAhead结果列表。

//typeAhead

service = {

    typeAheadContent: [],

    buildTypeAheadContent: function(input){
        return searchAPI.executeSearch(input, 10, 1).then(function(res){
            for(var i = 0; i < res.length; i++){
                service.typeAheadContent.push(res[i]);
            }
        });
    },  

    getTypeAheadResults: function(input){
        return service.buildTypeAheadContent(input).then(function(){
            return service.typeAheadContent;
        });     
    }
};

这里有一些事情。

1)我仍然得到角度的悬念,所以我不知道我的承诺设置是否完全达到标准。除了我的预先输入之外,我还有其他用于searchAPI请求构建功能的用法,这就是为什么我想让请求构建器/ firer成为它自己独立的东西。

2)我需要帮助测试这种typeAhead服务。对于单元测试,我如何确保searchAPI实际上不会转到我的后端,而是返回一些模拟数据或模拟承诺或什么?如果我能做的话,这样的事情将是理想的。

searchAPI.executeSearch = function(){
    return [
        'item1',
        'item2',
        'item3'
    ]
}

我尝试在我的茉莉花测试中做这样的事情,但是以这种方式嘲笑它,我没有调用一个承诺,只是设置一个返回值。

有人可以帮我开始设置并嘲笑一些承诺吗?

//// //// EDIT

这是我在茉莉花测试中的每个功能之前的事。

var searchAPI, typeAhead;
beforeEach(inject($rootScope, $injector, $q)
{
    typeAhead = $injector.get('typeAhead');
    searchAPI = $injector.get('searchAPI');
    searchAPI.executeSearch = function(input, resultsPerPage, pageNumber){

        // this is being alerted just fine
        alert("Inside mock");
        return $q.when([
            'item1', 'item2', 'item3'
        ]);
    }
    $rootScope.$digest();
}));

it('should construct typeahead stuff', function(){

    searchAPI.executeSearch("hello", 10, 1).then(function(res){

        //this is not being alerted
        alert(res);
    });
    typeAhead.buildTypeAheadContent("test");
});

所以我提供了一些帮助调试的东西。提醒“Inside Mock”的代码行确实被警告了,所以我知道我分配给executeSearch的模拟事物正在被正确设置。但是,.then块中的代码没有被警告,因此我的承诺不能被解决或者某事......

1 个答案:

答案 0 :(得分:1)

你对promises的使用听起来很不错,并且与它看起来的样子相当。那很好。

至于你的问题 - 我可能会嘲笑它以反映最初的API - 用静态值模拟承诺 - 你可以使用$q.when

searchAPI.executeSearch = function(){
    return $q.when([
        'item1',
        'item2',
        'item3'
    ]);
};

$q.when将外来(非Angular)承诺或简单值转换为Angular承诺 - 在本例中为您的数组。