首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >PACT.io:运行npm run pactTest时出现获取缺少请求错误

PACT.io:运行npm run pactTest时出现获取缺少请求错误
EN

Stack Overflow用户
提问于 2018-09-26 23:02:21
回答 1查看 2.4K关注 0票数 1

已创建测试回购:

期望的

运行npm run pactTest,这将为我的TotalPayout.test.pact.ts文件创建一个Pact文件。

结果

代码语言:javascript
复制
D, [#38238] DEBUG -- : {
  "description": "a GET request with a user id",
  "request": {
    "method": "GET",
    "path": "/frontoffice/api/liquidity-pool/get-total-payout",
    "headers": {
      "Accept": "application/json"
    }
  },
  "response": {
    "status": 200,
    "headers": {
      "Content-Type": "application/json"
    }
  }
}
W, [#38238]  WARN -- : Verifying - actual interactions do not match expected interactions. 
Missing requests:
  GET /frontoffice/api/liquidity-pool/get-total-payout


W, [#38238]  WARN -- : Missing requests:
  GET /frontoffice/api/liquidity-pool/get-total-payout

这里是我的约定文件

代码语言:javascript
复制
// @ts-ignore
import path from 'path';
// @ts-ignore
import { Pact } from '@pact-foundation/pact';
import { getTotalPayout } from './LiquidityPool';

// const port = 12345;
const endpoint = '/frontoffice/api/liquidity-pool/get-total-payout';

const EXPECTED_BODY = {
  total_payout: 100.21,
};

const userId = 'foo';

describe('The API', () => {
  // Copy this block once per interaction under test
  describe('getUsersTotalPayout', () => {
    beforeEach(() => {
      const interaction = {
        uponReceiving: 'a GET request with a user id',
        withRequest: {
          method: 'GET',
          path: endpoint,
          headers: {
            Accept: 'application/json',
          },
        },
        willRespondWith: {
          status: 200,
          headers: {
            'Content-Type': 'application/json'
          },
          data: EXPECTED_BODY
        },
      };

      // @ts-ignore
      return provider.addInteraction(interaction);
    });
​
    // add expectations
    it('Should call getUsersTotalPayout and return an object with the total_payout', done => {
      getTotalPayout(userId)
        .then((response: any) => {
          console.log('response', response);
          console.log('EXPECTED_BODY', EXPECTED_BODY);
          expect(response).toEqual(EXPECTED_BODY);
        })
        .then(done);
    });
  });
});

以下是包含 getTotalPayout 函数的服务文件:

这个端点还不存在,但我的理解是这个Pact测试应该仍然有效。

代码语言:javascript
复制
// @TODO Note, this is the placeholder for LiquidityPool API endpoints
// @ts-ignore
import axios, * as others from 'axios';

const endpoint = '/frontoffice/api/liquidity-pool/';

export const getTotalPayout = async (userId: string) => {
  const response = await axios.get(`${endpoint}get-total-payout`, { params: userId });
  return response.data;
};

src/__mocks__/axios.ts中模拟my my axios mock

代码语言:javascript
复制
// tslint:disable-next-line:no-empty
const mockNoop = () => new Promise(() => {});

export default {
  get: jest.fn(() => Promise.resolve({ data: { total_payout: 100.21 }})),
  default: mockNoop,
  post: mockNoop,
  put: mockNoop,
  delete: mockNoop,
  patch: mockNoop
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-27 04:51:38

很简单-您的测试没有命中Pact Mock Server上的路径/frontoffice/api/liquidity-pool/get-total-payout

您已经将Pact设置为在http://localhost:1234上运行,因此您的实际代码需要配置为访问此服务器,而不是真正的服务器。

在您的axios配置中,您模拟了http请求库,因此它什么也不做。因此,当您的实际代码使用它时,它不会使http调用和您的Pact测试失败,因为它期望一个具有特定形状的调用,但没有得到它。

以下是您需要更改的内容:

似乎使用了

  1. Axios,但它不在您的package.json中。我猜是因为你在模仿它(2)。你需要一个实际的http请求库,所以你可能只需要安装axios
  2. Axios就可以提供录制的响应,不要在Pact测试期间模仿axios (如果你愿意,这对于本地开发人员也是可以的),因为这会阻止对Pact的实际调用。Pact需要对它进行真正的http调用,以便它可以检查您的代码是否做了正确的事情,然后将它在测试中发现的内容写入到'contract'
  3. Configure axios中,以访问Pact模拟服务。假设您使用的是axios,应该可以使用如下代码:

pactSetup.ts:

代码语言:javascript
复制
  // Configure axios to use the Pact mock server for Pact tests
  import axios from "axios";
  axios.defaults.baseURL = "http://localhost:1234";

  1. 读取Pact输出的日志文件。它会告诉你发生了什么。重复一遍:您已经告诉Pact应该在/frontoffice/api/liquidity-pool/get-total-payout上有一个交互,但它从未收到过。让你的实际代码实现这一点,然后你就会好起来。

最后,顺便说一句,一旦您开始生成Pact (在1-4固定之后),您可能希望使用Pact作为本地开发的本地存根服务器。这个二进制文件实际上已经安装在您的node_modules中,有关它的操作方法的文档位于https://github.com/pact-foundation/pact-ruby-standalone/releases

我通常在package.json中有一个如下所示的脚本:

代码语言:javascript
复制
  "stubs": "$(find . -name pact-stub-service | head -n 1) pacts/* --port 4000"

然后,您可以运行npm run stubs,并让提供者的本地存根在端口4000上运行,其中包含您输入到测试中的所有请求/响应。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52520827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档