2016-04-01 5 views
1

У меня есть AuthService, который имеет зависимость от userService, которая приходит из другого модуляЖасмин и AngularJS - Модульное тестирование высмеивали зависимость

Я пытаюсь написать модульный тест, который проверяет свойство userService, который я издевались и включали использование службы $ provision в моей спецификации теста.

beforeEach(function() { 
    module('app.services'); 
    //Need to provide userService since it lives in a different module 
    module(function ($provide) { 
     $provide.value('userService', function(){ 
      return { 
       userLoggedIn: false 
      } 
     }); 
    }); 
}); 

//Question - will injecting _userService_ pick up the mocked instance from above? 
beforeEach(inject(function(_AuthService_, _userService_) { 
    authService = _AuthService_; 
    userService = _userService_; 
})); 

describe('some text', function() { 
    it('should make a get request to check the users token', function() { 
     $httpBackend.expectGET('/auth/checktoken').respond({}); 
     authService.hasAccessToken(); 
     $httpBackend.flush(); 
    }); 
    it('should set userService.userLoggedIn to be true', function() { 
     expect(userService.userLoggedIn).toBeTruthy(); 
    }); 
}); 

Мое ожидание на моем сервисе пользователя не срабатывает, поскольку оно возвращается как неопределенное. Что мне нужно сделать, чтобы протестировать мои издевательства userService?

Благодаря

UPDATE

ИТАК на основе замечаний, я могу получить его, чтобы передать организуя свои тесты, как так

describe('hasAccessToken', function() { 
    beforeEach(function(){ 
     authService.hasAccessToken(); 
    }); 
    it('should make a get request to catalogues', function() { 
     $httpBackend.expectGET('/auth/checktoken').respond({}); 
     $httpBackend.flush(); 
    }); 
    it('should set userService.userLoggedIn to be true', function() { 
     $httpBackend.expectGET('/auth/checktoken').respond({}); 
     $httpBackend.flush(); 
     expect(userService.userLoggedIn).toBeTruthy(); 
    }); 
    }); 

Как вы можете видеть, что я пытаюсь написать тест для expectGET и userService отдельно, это правильно? Просто кажется довольно многословным?

+0

Is действие инъецирования authService, достаточное для установки userLoggedIn в true, или вам не хватает вызова? Что-то вроде authService.login (пользователь); –

+0

Да, извините, я обновил свой фрагмент кода, поэтому есть более ранний тест, который вызывает вызов 'authService.hasAccessToken()', который устанавливает 'userService.userLoggedIn' значение true – mindparse

+0

Метод beforeEach выполняется перед каждым тестом, и, как вы его знаете сбрасывает состояние userService. Вы можете поместить вызов hasAccessToken в свой метод beforeEach или вызвать его в каждом тесте по своему усмотрению. –

ответ

0

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

пытаются использовать конструктор службы с service синтаксиса instaed:

beforeEach(module(function ($provide) { 
    $provide.service('userService', function(){ 
     return { 
      userLoggedIn: false 
     } 
    }); 
}); 

или просто использовать экземпляр сервиса с value синтаксисом:

beforeEach(module(function ($provide) { 
    $provide.value('userService', { 
      userLoggedIn: false 
     } 
    }); 
}); 

см угловые документы: $provide

Смежные вопросы