Модульный тест queryParams подписка (Angular5) - PullRequest
0 голосов
/ 24 мая 2018

У меня проблемы с проверкой логики внутри подписки ActivatedRoute queryParams.

constructor(private router: Router, private route: ActivatedRoute, private auth: AuthService) {}

ngOnInit(): void {
  this.route.queryParams.subscribe((params:any) => {
    if(params['data']) {
      this.handle(params['data']);
    } else {
      if (this.auth.isAuthenticated()) {
        this.router.navigate(['/home']);
      }
    }
  });
}

Я хочу проверить:

  • Если this.handle() запускается при издевании params['data'] предоставляется
  • Если нет параметров и this.auth.isAuthenticated() возвращает true, что this.router.navigate называется

Я перепробовал несколько вещей, и у меня заканчиваются идеи.

Мой тестовый файл:

describe('TestComponent', () => {
  let component: TestComponent;
  let fixture: ComponentFixture<TestComponent>;

  const mockService = {
    navigate: jasmine.createSpy('navigate'),
    isAuthenticated: jasmine.createSpy('isAuthenticated'),
    queryParams: jasmine.createSpy('queryParams')
  };

  beforeEach(async(() => {
    TestBed.configureTestingModule({
      declarations: [TestComponent],
      providers: [
        { provide: Router, useValue: mockService },
        { provide: ActivatedRoute, useValue: mockService },
        { provide: AuthService, useValue: mockService }
      ]
    }).compileComponents();

    fixture = TestBed.createComponent(TestComponent);
    component = fixture.componentInstance;

    mockService.navigate.calls.reset();
  }));

  it('should create the test component', () => {
    expect(component).toBeTruthy();
  });

  it('should navigate away when authenticated', () => {
    mockService.isAuthenticated.and.returnValue(true);
    mockService.queryParams.and.callFake((data, params) => new Observable(o => o.next({ params: {} })));
    component.ngOnInit();
    expect(mockService.navigate).toHaveBeenCalledWith(['/home']);
  });
});

Но с этим я получаю TypeError: this.route.queryParams.subscribe is not a function.Я знаю, что mockService.isAuthenticated.and.returnValue(true); работает правильно, потому что до использования подписки на параметры у меня было только это, если оператор внутри ngOnInit().

Я пытался изменить mockService на:

const mockService = {
  navigate: jasmine.createSpy('navigate'),
  isAuthenticated: jasmine.createSpy('isAuthenticated'),
  queryParams: {
    subscribe: jasmine.create('subscribe')
  }
};

Я также попробовал:

const mockService = {
  navigate: jasmine.createSpy('navigate'),
  isAuthenticated: jasmine.createSpy('isAuthenticated'),
  queryParams: {
    subscribe: Observable.of({ params: {} })
  }
};

Но безуспешно, за последние два я получаю Expected spy navigate to have been called with [ [ '/home' ] ] but it was never called.

Так кто-нибудь знает, как правильно проверить логику внутри подписки querParams?

1 Ответ

0 голосов
/ 06 декабря 2018

Я не могу сказать, слишком поздно, чтобы ответить на этот вопрос или нет, но, возможно, это поможет новым гуглерам ...

Мне удается решить это следующим образом:

		class ActivatedRouteMock {
			queryParams = new Observable(observer => {
        const urlParams = {
          param1: 'some',
          param2: 'params'
        }
				observer.next(urlParams);
				observer.complete();
			});
		}

		beforeEach(async(() => {
			TestBed.configureTestingModule({
				imports: [
					HttpClientTestingModule
				],
				providers: [
					HttpClient,
					HttpHandler,
					ControlContainer,
					{
						provide: ActivatedRoute,
						useClass: ActivatedRouteMock
					}
				]
			}).compileComponents();

			injector = getTestBed();
			httpMock = injector.get(HttpTestingController);
		}));

Это позволяет вам утверждать логику в вашем .subscribe(() => {}) методе.

Надеюсь, что hepls

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...