如何在 angular js 中测试 $http 调用?
how to test $http call in angular js?
我正在尝试使用 karma 和 jasmine.I 测试我的 $http 请求并创建一个控制器并注入服务。在服务中我调用 $http service.I 需要测试该服务 我将如何测试该服务 这是我的控制器。
angular.module('app',[]).controller('first',function($scope,data){
$scope.name='test';
data.getData().then(function(data){
console.log(data);
})
}).factory('data',function($http){
return{
getData:getData
}
function getData(){
return $http.get('data.json').success(successCall).error(errorcallback)
}
function successCall(data){
return data
}
function errorcallback(data){
return data
}
})
这里是 plunker
http://plnkr.co/edit/POryyDUc8bvvfvI5Oap7?p=preview
我是这样开始的
describe('http controller test', function () {
var $rootScope,
$scope,
controller;
beforeEach(function(){
module('app') ;
inject(function($injector){
$rootScope = $injector.get('$rootScope') ;
$scope=$rootScope.$new();
controller =$injector.get('$controller')('first',{$scope:$scope})
})
})
describe('Init value',function(){
it('check name value',function(){
expect($scope.name).toEqual('test');
})
})
it('it should be true',function(){
expect(true).toBeTruthy();
})
})
你能告诉我当控制器中有服务依赖时如何编写测试吗??如何在 jasmine 中测试 $http 请求?在我的控制器中有一个服务的依赖项。如何在我的测试文件中注入它?
您可以这样注入 data
服务:
describe('http controller test', function () {
var $rootScope,
$scope,
data,
controller;
beforeEach(module('app'));
beforeEach(inject(function ($controller, $rootScope, $state, _data_) {
scope = $rootScope.$new();
state = $state;
data = _data_;
controller = $controller('first',{$scope:$scope});
});
it('data service should be defined',function(){
expect(data).toBeDefined();
});
});
有一个关于使用 Angular 和 Jasmine here and an example regarding testing $http promises here 使用 $httpBackend 测试 promises 的例子。
$httpbackend 就是你所需要的。
API Reference / ngMock / service components in ngMock / $httpBackend
这是该页面的一个片段。
describe('MyController', function() {
var $httpBackend, $rootScope, createController, authRequestHandler;
// Set up the module
beforeEach(module('MyApp'));
beforeEach(inject(function($injector) {
// Set up the mock http service responses
$httpBackend = $injector.get('$httpBackend');
// backend definition common for all tests
authRequestHandler = $httpBackend.when('GET', '/auth.py')
.respond({userId: 'userX'}, {'A-Token': 'xxx'});
// Get hold of a scope (i.e. the root scope)
$rootScope = $injector.get('$rootScope');
// The $controller service is used to create instances of controllers
var $controller = $injector.get('$controller');
createController = function() {
return $controller('MyController', {'$scope' : $rootScope });
};
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should fetch authentication token', function() {
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
});
我正在尝试使用 karma 和 jasmine.I 测试我的 $http 请求并创建一个控制器并注入服务。在服务中我调用 $http service.I 需要测试该服务 我将如何测试该服务 这是我的控制器。
angular.module('app',[]).controller('first',function($scope,data){
$scope.name='test';
data.getData().then(function(data){
console.log(data);
})
}).factory('data',function($http){
return{
getData:getData
}
function getData(){
return $http.get('data.json').success(successCall).error(errorcallback)
}
function successCall(data){
return data
}
function errorcallback(data){
return data
}
})
这里是 plunker http://plnkr.co/edit/POryyDUc8bvvfvI5Oap7?p=preview
我是这样开始的
describe('http controller test', function () {
var $rootScope,
$scope,
controller;
beforeEach(function(){
module('app') ;
inject(function($injector){
$rootScope = $injector.get('$rootScope') ;
$scope=$rootScope.$new();
controller =$injector.get('$controller')('first',{$scope:$scope})
})
})
describe('Init value',function(){
it('check name value',function(){
expect($scope.name).toEqual('test');
})
})
it('it should be true',function(){
expect(true).toBeTruthy();
})
})
你能告诉我当控制器中有服务依赖时如何编写测试吗??如何在 jasmine 中测试 $http 请求?在我的控制器中有一个服务的依赖项。如何在我的测试文件中注入它?
您可以这样注入 data
服务:
describe('http controller test', function () {
var $rootScope,
$scope,
data,
controller;
beforeEach(module('app'));
beforeEach(inject(function ($controller, $rootScope, $state, _data_) {
scope = $rootScope.$new();
state = $state;
data = _data_;
controller = $controller('first',{$scope:$scope});
});
it('data service should be defined',function(){
expect(data).toBeDefined();
});
});
有一个关于使用 Angular 和 Jasmine here and an example regarding testing $http promises here 使用 $httpBackend 测试 promises 的例子。
$httpbackend 就是你所需要的。
API Reference / ngMock / service components in ngMock / $httpBackend
这是该页面的一个片段。
describe('MyController', function() {
var $httpBackend, $rootScope, createController, authRequestHandler;
// Set up the module
beforeEach(module('MyApp'));
beforeEach(inject(function($injector) {
// Set up the mock http service responses
$httpBackend = $injector.get('$httpBackend');
// backend definition common for all tests
authRequestHandler = $httpBackend.when('GET', '/auth.py')
.respond({userId: 'userX'}, {'A-Token': 'xxx'});
// Get hold of a scope (i.e. the root scope)
$rootScope = $injector.get('$rootScope');
// The $controller service is used to create instances of controllers
var $controller = $injector.get('$controller');
createController = function() {
return $controller('MyController', {'$scope' : $rootScope });
};
}));
afterEach(function() {
$httpBackend.verifyNoOutstandingExpectation();
$httpBackend.verifyNoOutstandingRequest();
});
it('should fetch authentication token', function() {
$httpBackend.expectGET('/auth.py');
var controller = createController();
$httpBackend.flush();
});