Я пытаюсь настроить Pact JS с Angular и GraphQL.
В моем проекте я отправляю запрос на конечную точку / api. Я перенаправляю его на другой хост, используя наш бэкэнд, как прокси.
Когда я запускаю npm run test
, я вижу это исключение
npm 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

Ссылка на файл теста и проект, который вы можете найти на 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);