2015-09-09 2 views
1

Как я могу сделать блок-тест $ HTTP завод, если он с помощью метода POST, например:

// 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/выход из системы Нет больше просьба ожидать »

ответ

2

Вы хотите написать юнит-тест на $ HTTP заводе, но в тесте , внутри есть контроллер $. Возможно, вам следует отделить этот тест до 2 единичных тестов, один для контроллера, один для завода.

Когда вы тестируете logOutFactory, вы должны создать $ httpBackend для издевательства над задним концом, а также logOutFactory.

var logOutFactory, httpBackend; 

В beforeEach, это просто необходимо инициализировать эти 2 переменные:

beforeeach(inject(function($httpBackend, logOutFactory) { 
    httpBackend = $httpBackend; 
    logOutFactory = logOutFactory; 
})); 

И дразнят httpBackend в методе испытаний:

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; 
}); 
Смежные вопросы