Настройка Pact JS с Angular и GraphQL - PullRequest
0 голосов
/ 02 февраля 2020

Я пытаюсь настроить Pact JS с Angular и GraphQL.

В моем проекте я отправляю запрос на конечную точку / api. Я перенаправляю его на другой хост, используя наш бэкэнд, как прокси.

Когда я запускаю npm run test, я вижу это исключение

imagenpm run test I see this exception ">

Мой сервис, который мне нужно проверить как потребитель

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { Apollo } from 'apollo-angular';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';


@Injectable()
export class DataService {
    static itemQueries = require('graphql-tag/loader!./queries.graphql');

    constructor(private apollo: Apollo) {}

    getData(path: string): Observable<any> {
        return this.apollo
            .query<{ item }>({
                query: DataService.itemQueries['GetData'],
                fetchPolicy: 'no-cache',
                variables: {
                    path,
                },
            })
            .pipe(
                map((result) => {
                    return result;
                })
            );
    }
}

pact.spe c .ts На самом деле, здесь я тестирую expect('Home').toBe('Home');, но просто для того, чтобы убедиться, что все настроено правильно.

import { HttpClientModule } from '@angular/common/http';
import { TestBed } from '@angular/core/testing';
import { PactWeb } from '@pact-foundation/pact-web';
import { ApolloModule, APOLLO_OPTIONS } from 'apollo-angular';
import { HttpLink, HttpLinkModule } from 'apollo-angular-link-http';
import { ApolloTestingController } from 'apollo-angular/testing';
import { InMemoryCache } from 'apollo-cache-inmemory';
import { DataService } from './data.service';

function createApollo(httpLink: HttpLink) {
    return {
        link: httpLink.create({ uri: 'http://localhost:1234/api' }),
        cache: new InMemoryCache(),
    };
}

describe('DataService to CMS Data Contract', function() {
    let service: DataService;
    let provider;

    const EXPECTED_BODY = {
        result: true
    };

    beforeAll((done) => {
        TestBed.configureTestingModule({
            imports: [ApolloModule, HttpLinkModule, HttpClientModule],
            providers: [
                DataService,
                {
                    provide: APOLLO_OPTIONS,
                    useFactory: createApollo,
                    deps: [HttpLink],
                },
            ],
        });

        service = TestBed.get(DataService);

        provider = new PactWeb({
            consumer: '',
            provider: '',
            spec: 2,
        });

        provider.removeInteractions().then(done, done.fail);
    });

    afterEach(async (done) => {
        provider.verify().then(done, done.fail);
    });

    afterAll(async (done) => {
        provider.finalize().then(done, done.fail);
    });

    describe('and there is a valid user session', () => {
        beforeEach(async (done) => {
            provider
                .addInteraction({
                    state: 'i have a list of projects',
                    uponReceiving: 'a request for projects',
                    withRequest: {
                        method: 'POST',
                        path: '/api',
                        headers: {
                            Accept: 'application/json',
                        },
                    },
                    willRespondWith: {
                        status: 200,
                        headers: {
                            'Content-Type': 'application/json',
                        },
                        body: EXPECTED_BODY,
                    },
                })
                .then(done, done.fail);
        });

        it('generates a Content root item', async (done) => {
            console.log('start test');
            service.getData('path').subscribe((item) => {
                expect('Home').toBe('Home');
                done();
            });
        });
    });
});

карма. конф. js

enter image description here

Ссылка на файл теста и проект, который вы можете найти на github https://github.com/stativa/pact

ОБНОВЛЕНИЕ:

Теперь я получаю

Failed: Actual interactions do not match expected interactions for mock MockService.

Missing requests:
    OPTIONS http://localhost:1234/api

Однако у меня есть

provider
                .addInteraction({
                    state: 'i have a list of projects',
                    uponReceiving: 'a request for projects',
                    withRequest: {
                        method: 'OPTIONS',
                        path: 'http://localhost:1234/api',
                    },
                    willRespondWith: {
                        status: 200,
                        body: { },
                    },
                })
                .then(done, done.fail);

1 Ответ

0 голосов
/ 03 февраля 2020

Кажется, это связано с CORS. Вы читали вики-страницу на CORS? https://github.com/pact-foundation/pact-mock_service/wiki/Using-the-mock-service-with-CORS

...