AngularJS + Jasmine模拟单元测试POST方法的$ http工厂 [英] AngularJS + Jasmine mock unit test $http factory of POST method

查看:95
本文介绍了AngularJS + Jasmine模拟单元测试POST方法的$ http工厂的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

如果使用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屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆