Как сделать Тестирование с Angular 6 и клиентом Apollo для GraphQl - PullRequest
0 голосов
/ 20 сентября 2018

Я пытаюсь сделать тестовую разработку с Angular 6 и GraphQl, но мы действительно не знаем, как это сделать наилучшим из возможных способов.Я пытался найти что-то в Интернете, что объясняет это, но ничего хорошего не было найдено.

Я опубликую свое дело здесь в поисках кого-то, кто мог бы помочь мне, или кого-то, кто мог бы сказать мнелюбой учебник / Интернет, чтобы найти больше и полезную информацию.

Проблема

Я хочу проверить аутентификацию.У меня есть auth.service.js и соответствующий spec.js .Вы можете увидеть это ниже:

AUTH_SERVICE_TS

import { Injectable } from '@angular/core';
import { Store } from '@ngrx/store';
import * as UserActions from './../../store/user/actions';
import gql from 'graphql-tag';
import { Apollo } from 'apollo-angular';
import { Router } from '@angular/router';

@Injectable({
  providedIn: 'root'
})
export class AuthService {
    user;

    constructor(private store: Store<any>, private apollo: Apollo, private router: Router) {
        this.store.select('state').subscribe(state => this.user = state);
    }

    /**
     * Function that check the email and password for login
     * @param email
     * @param password
     */
    login(email: string, password: string) {
        this.apollo.mutate({
            mutation: this.loginRequestGql(),
            variables: {
                email: email,
                password: password
            }
        }).subscribe(value => {
            const data = value.data.login;

            this.saveUserData(data);
            this.router.navigate(['/app']);
        });

    }

    /**
     * Function that save user data in the store and in the session storage
     * @param data
     */
    saveUserData(data) {
        this.store.dispatch(new UserActions.Login({token: data.token}));
        this.setSessionStorage(this.user);
    }

    /**
     * Function that remove user info in the store
     */
    logout() {
        this.store.dispatch(new UserActions.Logout());
        this.setSessionStorage(this.user);
    }

    /**
     * Function that create the request with Graphql sintax
     */
    loginRequestGql() {
        return gql`
            mutation Login($email: String!, $password: String!) {
                login(email: $email, password: $password) {
                    token
                }
            }
        `;
    }

    /**
     * Function that save in the session storage the data parameter
     * @param data
     */
    setSessionStorage(data) {
        sessionStorage.setItem('session', JSON.stringify(data));
    }
}

AUTH_SERVICE_SPEC_TS

import { TestBed, inject } from '@angular/core/testing';

import { ApolloTestingController, ApolloTestingModule } from "apollo-angular/testing";
import { RouterTestingModule } from '@angular/router/testing';
import { AuthService } from './auth.service';

import { Store, StoreModule } from '@ngrx/store';
import { reducer } from '../../store/user/reducer';

describe('AuthService', () => {
    let backend: ApolloTestingController;
    let authService: AuthService;

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [ RouterTestingModule, ApolloTestingModule, StoreModule.forRoot({ state: reducer }) ],
            providers: [ AuthService,
                { provide: ApolloTestingModule, useClass: ApolloTestingModule }
            ]
        });
    });

    beforeEach(() => {
        backend = TestBed.get(ApolloTestingController);
        authService = TestBed.get(AuthService);
    });

    it('should be created', inject([AuthService], (service: AuthService) => {
        expect(service).toBeTruthy();
    }));

    it('should test login', (done) => {
        const email = 'diego@mail.com';
        const password = '123456';

        // const a = authService.login(email, password);
        // expect(a).toBe(TEST_RESPONSE['data'].login.token);
        // authService.login(email, password);
        // backend.expectOne(authService.loginRequestGql).flush(TEST_RESPONSE);
    });
});

const TEST_RESPONSE: Object = {
        "data": {
            "login": {
                "token": "eyJ0eXAiOiJKLCJhbGciOiJSUzI1NiIsImp0aSI6IjZjZDBjMDMXX0.as7-r_nlYfJ2w3CfOqwtLcTlBg5LrwFcm_ZXZ_GzCl5Qq0GS92r5tqGJtFzRfG02PPoLZ8uwsbgLj-5v2pYBXHjBLZvbjnW_zgXRLoDEcrBDpfPAoVH85ca_hb_xVaIgEUGumUPfn2IOx0Ce8fLlqtWGqoWtWzcCE
        }
    };

Заранее спасибо сообществу !!Надеюсь, вы сможете мне помочь !!

PD: Если вам нужна дополнительная информация, просто запросите, и я передам.

1 Ответ

0 голосов
/ 22 сентября 2018

В одной из последних версий apollo-angular мы выпустили утилиту для тестирования.Техника тестирования во многом похожа на то, как вы тестируете HttpClient в Angular.

Чтобы узнать больше о том, как тестировать компоненты и сервисы, использующие Apollo, пожалуйста, прочитайте официальную документацию об этом.

https://www.apollographql.com/docs/angular/guides/testing.html

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