0

我想通过Karma单元测试我的应用程序构建在Angular上与Jasmine。该应用程序涉及到调用GitHub API并提取用户的所有仓库的名称并用这些名称填充数组。我试图测试数组正在被填充,但我有一些问题与$ httpBackend。

我控制器的相关部分:

readmeSearch.controller('ReadMeSearchController', ['RepoSearch', function(RepoSearch) { 

    var self = this; 
    self.gitRepoNames = []; 

    self.doSearch = function() { 
    var namesPromise = 
     RepoSearch.query(self.username) 
     .then(function(repoResponse) { 
      addRepoNames(repoResponse); 
     }).catch(function(error) { 
      console.log('error: ' + error); 
     }); 
    return namesPromise; 
    }; 

    addRepoNames = function(response) { 
    self.repoSearchResult = response.data; 
    for(var i = 0; i < self.repoSearchResult.length; i++) { 
     var name = self.repoSearchResult[i]['name'] 
     self.gitRepoNames.push(name); 
    }; 
    }; 

}]); 

我RepoSearch厂是:

readmeSearch.factory('RepoSearch', ['$http', function($http) { 

    return { 
    query: function(searchTerm) { 
     return $http({ 
     url: 'https://api.github.com/users/' + searchTerm + '/repos', 
     method: 'GET', 
     params: { 
      'access_token': gitAccessToken 
     } 
     }); 
    } 
    }; 

}]); 

和有关试验是这样的:

describe('ReadMeSearchController', function() { 
    beforeEach(module('ReadMeter')); 

    var ctrl; 

    beforeEach(inject(function($controller) { 
    ctrl = $controller('ReadMeSearchController'); 
    })); 

    describe('when searching for a user\'s repos', function() { 

    var httpBackend; 

    beforeEach(inject(function($httpBackend) { 
     httpBackend = $httpBackend 
     httpBackend 
     .expectGET('https://api.github.com/users/hello/repos?access_token=' + gitAccessToken) 
     .respond(
     { data: items } 
    ); 
    })); 

    afterEach(function() { 
     httpBackend.verifyNoOutstandingExpectation(); 
     httpBackend.verifyNoOutstandingRequest(); 
    }); 

    var items = [ 
     { 
     "name": "test1" 
     }, 
     { 
     "name": "test2" 
     } 
    ]; 

    it('adds search results to array of repo names', function() { 
     ctrl.username = 'hello'; 
     ctrl.doSearch(); 
     httpBackend.flush(); 
     expect(ctrl.gitRepoNames).toEqual(["test1", "test2"]); 
    }); 

    }); 

}); 

当我运行测试我收到错误

预期[]等于['test1','test2']。

显然这是因为self.gitRepoNames未被填充。当我刚刚在测试之前的预期控制台日志ctrl.repoSearchResult我得到

Object{data: [Object{name: ...}, Object{name: ...}]} 

这是哪里出了问题,我觉得,因为当它在被称为在addRepoNames功能回路self.repoSearchResult.length是不确定的。

所以我的问题是为什么response.data在测试中的addRepoNames函数中调用时返回数组?

任何帮助将不胜感激。

编辑:我应该提到,应用程序在服务器上运行时工作正常。

回答

0

ctrl.doSearch是一个异步功能。你应该在async way中处理它。试试:

it('adds search results to array of repo names', function(done) { 
    ctrl.username = 'hello'; 
    ctrl.doSearch().then(function() { 
    expect(ctrl.gitRepoNames).toEqual(["test1", "test2"]); 
    done(); 
    }); 
    httpBackend.flush();  
}); 
+0

嗨@yarons谢谢你的回复。我已经根据你的响应修改了测试(在'done()'上有'setTimeout',因为它引起了'$ digest'的问题),但我仍然遇到同样的问题。 – dbatten

+0

为什么'setTimeout'? '$ digest'有什么问题? – yarons

+0

我得到了'$ digest已在进行中'。从我用'done()'和'httpBackend.flush()'读取的内容经常会导致问题。我提到[这个问题](http://stackoverflow.com/questions/24341544/getting-digest-already-in-progress-in-async-test-with-jasmine-2-0) – dbatten