AngularJS + Jasmine模拟单元测试POST方法的$ http工厂 [英] AngularJS + Jasmine mock unit test $http factory of POST method
问题描述
如果使用post方法,如何对$ http工厂进行单元测试,例如:
How I can make unit-test of $http factory, if it using post method, for example:
// controller
$scope.logOut = function (){
logOutFactory.logOut().then(function(resp){
});
};
// service
app.factory('logOutFactory', ['$http', '$q', 'CONST', function ($http, $q, CONST){
var logoutApiUrl = CONST.URL+'logout';
return {
logOut: function() {
var deferred = $q.defer();
$http({
method: "post",
url: logoutApiUrl
})
.success(function (data) {
deferred.resolve(data);
})
.error(function (data) {
deferred.reject('error in $http request');
console.log(data, status, headers, config);
});
return deferred.promise;
}
}
}]);
// unit test
describe("myApp", function () {
beforeEach(module('app'));
describe("Ctrl", function () {
var scope, httpBackend, fakedMainResponse;
beforeEach(inject(function ($rootScope, $controller, $httpBackend, $http) {
scope = $rootScope.$new();
httpBackend = $httpBackend;
httpBackend.expectPOST('https://url/logout').respond(200);
$controller('Ctrl', {
$scope: scope,
$http: $http
});
}));
it("success response - empty array from server", function () {
//httpBackend.flush();
});
});
});
我如何在茉莉花测试中模拟$ http响应??? 我正在尝试,但是我看到一个错误错误:意外请求:POST/url/logout 预计不会有更多请求 "
How i can mock $http response in Jasmine test ??? I'm trying but i see an error "Error: Unexpected request: POST /url/logout No more request expected "
推荐答案
您想为$ http工厂编写一个单元测试,但是在您的测试中,里面有一个$ controller.也许您应该将此测试分为2个单元测试,一个用于控制器,一个用于工厂.
You want to write a unit-test for the $http factory, but in your test, there is a $controller inside. Maybe you should separate this test to 2 unit-tests, one for the controller, one for the factory.
在测试logOutFactory时,您应该创建一个$ httpBackend来模拟后端,以及 logOutFactory .
When you test the logOutFactory, you should create a $httpBackend for mocking the back end, and also logOutFactory.
var logOutFactory, httpBackend;
在beforeEach
中,只需初始化这两个变量:
In the beforeEach
, it just need to initialize these 2 variables :
beforeeach(inject(function($httpBackend, logOutFactory) {
httpBackend = $httpBackend;
logOutFactory = logOutFactory;
}));
然后在测试方法中模拟httpBackend:
And mock the httpBackend in the test method :
it("success response - empty array from server", function () {
httpBackend.expectPOST('https://url/logout').respond(200);
var success;
// call logOut
logOutFactory.logOut().then(function () {
success = true;
});
httpBackend.flush();
// verification
expect(succeeded).to.be.true;
});
这篇关于AngularJS + Jasmine模拟单元测试POST方法的$ http工厂的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!