2015-09-18 1 views
1

Я думаю, что я делаю все так же, как в учебниках, и есть странная ошибка. Я хочу высмеять $ http в моем LoginService и протестировать его. К сожалению, есть некоторые проблемы - похоже, что он не видит функции $ httpBackend. Это мой LoginService:

app.factory('LoginService', function($http) { 
//.. 
    var validateUser = function(username, password){ 
     $http.post('http://domain/api/login', 
     { 
      username: username, 
      password: password 
     }) 
     .success(function (data) { 
      //... 
     }); 
    }; 

    return { 
     validateUser: validateUser, 
     getLoginState: getLoginState 
    }; 
}); 

И есть тест для этой функции ValidateUser:

describe('LoginService', function() { 
var httpBackend, LoginService; 
beforeEach(module('app')); 

beforeEach(inject(function ($httpBackend, _LoginService_) { 
    LoginService = _LoginService_; 
    httpBackend = $httpBackend; 
})); 

afterEach(function() { 
    httpBackend.verifyNoOutstandingExpectation(); 
    httpBackend.verifyNoOutstandingRequest(); 
}); 

it('changes loginState object when user exists', inject(function(){ 
    data = {username: "ut_user", token: "123456"}; 
    httpBackend.expectPOST('http://domain/api/login').respond(data); 
    LoginService.validateUser("user", "pass"); 
    httpBackend.flush(); 
    expect(LoginService.getLoginState().loggedIn).toBe(true); 
})); 
}); 

И есть ошибка, которая была на httpBackend.verifyNoOutstandingExpectation(); и ранее на httpBackend.flush():

ReferenceError: $ is not defined 
at http://localhost:9876/base/js/routes.js:21:34 
at Scope.$broadcast (http://localhost:9876/base/node_modules/angular/angular.js:16200:28) 
at http://localhost:9876/base/node_modules/angular/angular.js:12231:45 
at Scope.$eval (http://localhost:9876/base/node_modules/angular/angular.js:15878:28) 
at Scope.$digest (http://localhost:9876/base/node_modules/angular/angular.js:15689:31) 
at Function.$httpBackend.verifyNoOutstandingExpectation (http://localhost:9876/base/node_modules/angular-mocks/angular-mocks.js:1563:38) 
at Object.<anonymous> (http://localhost:9876/base/spec/services/loginServiceSpec.js:11:21) 
at attemptSync (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1789:24) 
at QueueRunner.run (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1777:9) 
at QueueRunner.execute (http://localhost:9876/base/node_modules/jasmine-core/lib/jasmine-core/jasmine.js:1762:10) 

У меня есть карма конф:

files: [ 
    'node_modules/angular/angular.js', 
    'node_modules/angular-*/angular-*.js', 
    'js/**/*.js', 
    'spec/**/*.js' 
], 
+0

Показать полная трассировка стека. –

+0

Хорошо, я добавил. – Mossar

+1

Итак, ваш файл routes.js использует переменную с именем '$', в строке 21, которая не определена. Если вы используете jQuery, добавьте его в список файлов в конфиге karma. –

ответ

3

Ваш inject неверен

beforeEach(inject(function ($httpBackend, _LoginService_) { 
    LoginService = _LoginService_; 
    httpBackend = $httpBackend; 
})); 

вместо этого должен быть

beforeEach(inject(function (_$httpBackend_, _LoginService_) { 
    LoginService = _LoginService_; 
    httpBackend = _$httpBackend_; 
}));