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
函数中调用时返回数组?
任何帮助将不胜感激。
编辑:我应该提到,应用程序在服务器上运行时工作正常。
嗨@yarons谢谢你的回复。我已经根据你的响应修改了测试(在'done()'上有'setTimeout',因为它引起了'$ digest'的问题),但我仍然遇到同样的问题。 – dbatten
为什么'setTimeout'? '$ digest'有什么问题? – yarons
我得到了'$ digest已在进行中'。从我用'done()'和'httpBackend.flush()'读取的内容经常会导致问题。我提到[这个问题](http://stackoverflow.com/questions/24341544/getting-digest-already-in-progress-in-async-test-with-jasmine-2-0) – dbatten