Angular 6 mock REST api с Pact.js, ошибка: Failed: фактические взаимодействия не соответствуют ожидаемым взаимодействиям для mock MockService

Я пытаюсь имитировать Angular Rest API с помощью Pact.js, но получаю ошибку Failed: Actual interactions do not match expected interactions for mock MockService.

Мой оригинальный API вызывается вместо имитируемого сервера. Когда я пытаюсь ПОЛУЧИТЬ http://localhost:1234/users (макет api сервера пакта).

Получаю результат: {"message":"No interaction found for GET /","interaction_diffs":[]}

Ожидаемое поведение: фактический вызов Rest API перенаправляется на фиктивный сервер, и я должен получить фиктивный вывод. (см. ожидаемый пользователь в приведенном ниже коде.), а не фактический результат api.

Ниже мой код:

Karma.conf.js

   ...
    pact: [{
      cors: true,
      port: 1234,
      consumer: "ui",
      provider: "usersservice",
      host: '127.0.0.1',
      dir: "pacts/",
      spec: 2
    }],
    proxies: {
       // below is a fake rest API I'm trying to mock.
      'http://jsonplaceholder.typicode.com/users': 'http://localhost:1234/users'
    },
...

user.service.pact.spec.ts

import { TestBed } from '@angular/core/testing';
import { HttpClientModule } from '@angular/common/http';
import { UsersService } from './shared/users.service';
import { User } from './shared/user';
import { PactWeb, Matchers } from '@pact-foundation/pact-web';

describe('UsersService pack test', () => {
    let provider;

    beforeAll(function (done) {
        provider = new PactWeb({
            cors: true,
            consumer: 'ui',
            provider: 'users-service',
            port: 1234,
            host: '127.0.0.1',
        });
        // required for slower CI environments
        setTimeout(done, 2000);

        // Required if run with `singleRun: false`
        provider.removeInteractions();
    });

    afterAll(function (done) {
        provider.finalize()
            .then(function () {
                done();
            }, function (err) {
                done.fail(err);
            });
    });

    beforeEach(() => {
        TestBed.configureTestingModule({
            imports: [
                HttpClientModule
            ],
            providers: [
                UsersService
            ],
        });
    });

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

    describe('getUsers()', () => {
        const expectedUser: User[] = [{
            "id": 9,
            "name": "test user",
            "email": "[email protected]",
            "phone": "1-999-999-9999 x99999",
            }];

        beforeAll((done) => {
            provider.addInteraction({
                state: `provider return a expected user array`,
                uponReceiving: 'a request to GET a person',
                withRequest: {
                    method: 'GET',
                    path: 'http://jsonplaceholder.typicode.com/users',
                },
                willRespondWith: {
                    status: 200,
                    body: expectedUser, // to respond with defined data.
                    headers: {
                        'Content-Type': 'application/json'
                    }
                }
            }).then(done, error => done.fail(error));
        });

        it('should get Person array', (done) => {

            const usersService: UsersService = TestBed.get(UsersService);
            usersService.getUsers().subscribe(response => {
                console.log(response) // this logs actual API response not mocked.
                expect(response).toEqual(expectedUser); // this fails
                done();
            }, error => {
                done.fail(error);
            });
        });

    });
 });

Я следил за приведенными ниже источниками, но просто не мог создавать и перенаправлять на имитируемый API

https://reflectoring.io/consumer-driven-contracts-with-angular-and-pact/

https://github.com/thombergs/code-examples/tree/master/pact/pact-angular


person anoop    schedule 25.07.2018    source источник
comment
Пожалуйста, опубликуйте все содержимое user.service.pact.spec.ts   -  person Fabricio Lemos    schedule 25.07.2018
comment
FabricioLemos: Я добавил полный код user.service.pact.spec.ts   -  person anoop    schedule 26.07.2018
comment
@anoop Вы получили на это ответ?   -  person James Nurse    schedule 09.07.2020


Ответы (1)


Из того, что я могу почерпнуть, нигде в вашей тестовой настройке вы не говорите своему коду, что его конечная точка API отличается - вам нужно указать http-библиотеке / клиенту, чтобы она ударила по API pact, а не к вашему реальному (Pact не автоматически захватите ваш http-клиент).

Кроме того, в вашем WithRequest есть недопустимый путь. Вы не можете переопределить имя хоста в пакт-контрактах.

person Matthew Fellows    schedule 28.07.2018
comment
Я использую прокси в karma.conf.js, чтобы указать пакту использовать вместо него прокси api, также я использовал абсолютный путь в withrequest, поскольку мой домен API отличается от домена хоста angular. Например: мой интерфейс размещен на localhost:4200, а внутренний API - на localhost:3000. Сообщите мне, если я что-то пропущу? - person anoop; 29.07.2018
comment
Вы получили это наоборот. Pact - это фиктивный сервер, и вам нужно направить свой тестовый код на фиктивный сервер, чтобы он мог записывать взаимодействия. Пакт должен работать на локальном хосте - person Matthew Fellows; 29.07.2018