Тестирование 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 в функцию (или нет).

Другие вопросы по тегам