2015-07-20 4 views
0

Я пытаюсь протестировать API REST, завернутый в службу AngularJS, используя асинхронное тестирование Jasmine. Я знаю, я должен быть, и я, выполняю тесты API на сервере и используя mock $ httpBackend для тестирования службы.Jasmine Angular http testing

, но когда я проверить этот код:

'use strict'; 

describe('controllers: SiteCtrl', function() { 
var scope, httpBackend, http, controller; 
var zipcode = "94305"; 
beforeEach(module('ngMockE2E')); 
beforeEach(module('ironridge')); 

beforeEach(inject(function($rootScope, $controller, $httpBackend, $http) { 
    scope = $rootScope.$new(); 
    httpBackend = $httpBackend; 
    controller = $controller; 
    http = $http; 
    // httpBackend.w hen('http://api.zippopotam.us/us/' + zipcode).respond({}); 
    $controller('SiteCtrl', { 
     $scope: scope, 
     $http: $http 
    }); 
})); 

it('should define more than 5 awesome things',function(){ 

    expect(scope.nav.radio).toMatch('site'); 
}); 
it("should match a correct zip code", function() { 


    httpBackend.expectGET('http://api.zippopotam.us/us/' + zipcode).responde(200); 
    http.get('http://api.zippopotam.us/us/' + zipcode). 
      success(function(data) { 
       console.log(data); 
      }). 
      error(function(status) { 
       console.log(status); 
      }); 
    httpBackend.flush(); 


}); 
}); 

, но я получаю сообщение об ошибке при запуске теста

[16:01:41] all files 33.1 kB 
[16:01:41] Finished 'scripts' after 1.06 s 
[16:01:41] Starting 'test'... 
WARN [watcher]: Pattern "/home/hpro/ironridge/src/**/*.mock.js" does not match any file. 
INFO [karma]: Karma v0.12.37 server started at http://localhost:9876/ 
INFO [launcher]: Starting browser PhantomJS 
INFO [PhantomJS 1.9.8 (Linux 0.0.0)]: Connected on socket Cfi_cbdTVW-YOCX8_BaV with id 45541989 
PhantomJS 1.9.8 (Linux 0.0.0) controllers: SiteCtrl should match a correct zip code FAILED 
TypeError: 'undefined' is not a function (evaluating 'httpBackend.expectGET('http://api.zippopotam.us/us/' + zipcode).responde(200)') 
    at /home/hpro/ironridge/src/app/site/site.controller.spec.js:28 
PhantomJS 1.9.8 (Linux 0.0.0): Executed 2 of 2 (1 FAILED) (0.006 secs/0.059 secs) 
[16:01:42] 'test' errored after 1.41 s 
[16:01:42] Error: 1 
at formatError (/usr/lib/node_modules/gulp/bin/gulp.js:169:10) 
at Gulp.<anonymous> (/usr/lib/node_modules/gulp/bin/gulp.js:195:15) 
at Gulp.emit (events.js:107:17) 
at Gulp.Orchestrator._emitTaskDone (/home/hpro/ironridge/node_modules/gulp/node_modules/orchestrator/index.js:264:8) 
at /home/hpro/ironridge/node_modules/gulp/node_modules/orchestrator/index.js:275:23 
at finish (/home/hpro/ironridge/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:21:8) 
at cb (/home/hpro/ironridge/node_modules/gulp/node_modules/orchestrator/lib/runTask.js:29:3) 
at removeAllListeners (/home/hpro/ironridge/node_modules/karma/lib/server.js:215:7) 
at Server.<anonymous> (/home/hpro/ironridge/node_modules/karma/lib/server.js:226:9) 
at Server.g (events.js:199:16) 

Спасибо за помощь: D

+3

У вас есть опечатка, 'responsee' ->' reply' –

+1

ngMockE2E предназначен для сквозных тестов. Вы не должны использовать его для модульных тестов. –

+0

@AvraamMavridis после обновления этой опечатки Ошибка: Неожиданный запрос: GET приложение/сайт/site.html \t Нет больше просьбы ожидать \t в $ httpBackend (/ главной/HPro/Железный Хребет/bower_components/угловой издевается/угловой-издевается .js: 1227) \t на sendReq (/home/hpro/ironridge/bower_components/angular/angular.js:9704) \t на /home/hpro/ironridge/bower_components/angular/angular.js:9415 \t в processQueue (/home/hpro/ironridge/bower_components/angular/angular.js:13300) \t по адресу /home/hpro/ironridge/bower_components/angular/angular.js:13316 \t at/home/hpro/ironridge/bower_components/angular/an – Hamdi

ответ

1

Вы не можете сделать E2e тестов с httpBackend. Первый вариант, чтобы выполнить тесты E2E, и провести тесты для $ httpBackend, без тестов e2e и запустить его из теста grunt run grunt. Которые были бы модульными тестами. Второй вариант, с которым вы можете сначала смешивать, - создать отдельный файл для тестов E2E, также в синтаксисе Jasmine и запустить его независимо с транспортиром.


В отредактированном коде используйте флеш перед вызовом handle.success. Промывка означает, что операция начинает действовать. Вместо:

$http.get('http://api.zippopotam.us/us/' + zipcode). 
      then(handler.success,handler.error); 
      httpBackend.flush(); 

Запись:

var prom = $http.get('http://api.zippopotam.us/us/' + zipcode); 
httpBackend.flush(); 
prom.then(handler.success,handler.error); 

Вполне возможно, что handler.success вызывается перед вровень производится.

+0

я скорректировал код, но я получаю неопределенный результат от службы http, когда я регистрирую данные http://pastebin.com/M5BgziJF help please – Hamdi

+0

сделал это редактирование. – cyan