Тестирование Angular2: измените введенную стоимость сервиса
Я тестирую простой сервис. Сервис использует 2 значения из другого сервиса.
По сути, я хотел бы проверить эти 2 значения: isLogged = false и isLogged = true.
Можно ли просто изменить стоимость внедренной услуги, или мне нужно сделать что-то еще? (что я не знаю, так что если бы вы могли привести меня в путь, я был бы признателен).
Вот мой код для тестирования:
РЕДАКТИРОВАТЬ Я нашел решение моей проблемы. Вам нужно внедрить провайдера в параметры внедрения, и вы можете изменить его свойства по своему желанию после.
import { TestBed, async, inject } from '@angular/core/testing';
import { AuthGuardService } from './authguard.service';
import { Router } from '@angular/router';
import { AuthService } from './auth.service';
describe('AuthguardService', () => {
let calledUrl = '/logged/main/last';
let authServiceStub = {
isLogged: false,
redirectUrl: calledUrl
};
class RouterStub {
navigate(url: string) { return url; }
};
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
AuthGuardService,
{ provide: AuthService, useValue: authServiceStub },
{ provide: Router, useClass: RouterStub },
]
});
});
it('should ...', inject([AuthGuardService, Router], (service: AuthGuardService, router: Router) => {
let spy = spyOn(router, 'navigate');
service.checkLoginState(calledUrl);
expect(spy).toHaveBeenCalledWith(['/login']);
}));
});
1 ответ
Ваше заявленное решение является одним из способов. Если все, что вы хотите сделать, это изменить значения в тесте, то еще более краткий способ - просто изменить значения в authServiceStub напрямую:
// inside tests:
authServiceStub.isLogged = false;
...
authServiceStub.isLogged = true;
^ Простой, но не очень инкапсулированный.
Или параметризуйте это:
let isLogged: false;
let authServiceStub = {
isLogged: isLogged,
redirectUrl: calledUrl
};
...
// inside tests:
isLogged = false;
...
isLogged = true;
^ Кратко, но все еще не заключено в капсулу.
Или добавить сеттер:
let authServiceStub = {
isLogged: false,
setLogged: function(logged) { this.isLogged = logged; },
redirectUrl: calledUrl
};
...
// inside tests:
setLogged(false);
...
setLogged(true);
^ Немного более инкапсулировано. Может сочетаться с вашим инъекционным подходом.
Или, если isLogged были переопределены как функция, вы можете использовать spyOn:
// inside tests:
spyOn(authServiceStub, "isLogged").and.returnValue(false);
...
spyOn(authServiceStub, "isLogged").and.returnValue(true);
^ Больше "черного ящика" и, возможно, более гибкого / перспективного, особенно в сочетании с вашим инъекционным раствором (потому что вы можете резко изменить заглушку или насмешку и при этом получить желаемое поведение). Это больше работы заранее, так что может не стоить того. Но размышления об AuthService таким способом черного ящика могут дать вам повод для рефакторинга isLogged в функцию (или нет).