【发布时间】:2014-09-13 18:50:11
【问题描述】:
我正在尝试使用 Jasmine 测试一个真正的 http 调用(集成测试),但是当我调用一个使用 $http.get 的方法时,它会超时并且服务器永远不会被调用。
我知道我应该注入 $http 的实现,但不确定应该在哪里进行。
searchSvc
app.service('searchSvc', ['$http', '$q', searchSvc]);
function searchSvc($http, $q) {
return {
search: function(text) {
console.log('svc.search called with ', text); // this does get called
return $q.when($http.get('/search/' + text));
}
};
}
搜索规范
describe("searchTest", function() {
var ctrl, svc, $http;
beforeEach(function () {
module('testApp');
inject(function(_$controller_, searchSvc, _$http_){
ctrl = _$controller_('searchCtrl');
svc = searchSvc;
$http = _$http_;
})
});
it('test server search', function(done) {
svc.search('re').then(function(result) {
console.log('promise then'); // this never gets called, because server never gets called
expect(result).not.toBeNull();
expect(result.data).not.toBeNull();
expect(result.data.length).toBeGreaterThan(0);
done();
});
});
【问题讨论】:
-
我不确定它是否允许你这样做......这不是真正的单元测试。这是一个集成测试。我相信这个想法是测试使用
$httpBackendmock 调用服务器的代码,并使用自己的单元测试测试服务器本身,最后编写端到端测试以确保它们都能正常工作。这些将使用量角器运行并在没有模拟的情况下测试实际应用程序。 -
对,我从来没有说过这是一个单元测试。我正在尝试使用 Jasmine 进行集成测试以及单元测试
-
嗯。我懂了。现在我也很好奇。我删除了 angular-mocks,从一个实际的 angular 模块中引用了 $http 并尝试了它,它也永远不会解决这个承诺。我认为在正常运行的应用程序内部应该发生的事情不会在这里发生。有点像我们必须在测试中手动调用
$scope.$digest。 -
我猜这与依赖注入的工作方式有关?我见过带有控制器的示例,您可以在其中提供 Jasmine 块内的依赖项实现,但找不到服务的表示法
标签: angularjs jasmine integration-testing