2017-02-22 10 views
0

я определил интерфейс и непрозрачного маркер следующегоAngular2 жасмин SpyOn метод не существует

export let AUTH_SERVICE = new OpaqueToken('auth.service'); 

export interface AuthService { 
    logIn(): void; 
    logOut(): void; 
} 

В моем тестовом классе я обеспечиваю погасила версию AuthService, т.е.

@Injectable() 
class AuthServiceStub implements AuthService { 
    logIn(): void {} 
    logOut(): void {} 
} 

и установить до моего теста beforeEach следующего

beforeEach(async(() => { 
     TestBed.configureTestingModule({ 
      declarations: [ LoginComponent ], 
      providers: [ 
       {provide: AUTH_SERVICE, useValue: AuthServiceStub} 
      ] 
     }); 
    })); 

Я тогда начал написать тест, то есть,

it('should call log in on AuthService',() => { 
     let authService = fixture.debugElement.injector.get(AUTH_SERVICE); 
     spyOn(authService, 'logIn'); 
     // expect will go here 
}); 

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

Error: <spyOn> : logIn() method does not exist 

Не можете увидеть, что я делаю неправильно. Есть идеи?

+0

Если это ошибка времени выполнения, вы можете проверить экземпляр 'authService' в своем ide или браузере, чтобы узнать, существует ли метод' logIn'. – Igor

+0

У меня не было головы, отлаживая эти тесты соответствующим образом. Однако, если я добавлю конструктор в 'AuthServiceStub' и напишу в консоль в этом конструкторе, например,' console.log ('CREATED') ', он никогда не печатает' CREATED' для консоли - так что не уверен, что мой обрезанный сервис когда-либо получение создано .... –

ответ

6

Это потому, что вы используете свойство useValue в объекте поставщика. Это означает, что введенное значение будет являться классом AuthServiceStub. Вместо этого вам нужен именно тот экземпляр, который на самом деле имеет эти методы.

Для проведения тестовых работ замените useValue на useClass. Это приведет к тому, что система впрыска Angular будет фактически создавать экземпляр службы при создании провайдера, и ваш вызов fixture.debugElement.injector.get(AUTH_SERVICE); вернет правильный объект.

В качестве альтернативы вы можете создать экземпляр класса вручную:

it('should call log in on AuthService',() => { 
    let AuthService = fixture.debugElement.injector.get(AUTH_SERVICE); 
    let authService = new AuthService(); 
    spyOn(authService, 'logIn'); 
    // expect will go here 
}); 

Тем не менее, useClass является лучшим решением, так как он будет обрабатывать все будущие инъекции, что AuthService может понадобиться.

+0

Ха-ха! Работает ... что я полностью прошел мимо, читая тестовые документы. Отлично, я могу двигаться дальше :) –

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