【问题标题】:Problem: Consumer Driven Contract Testing with Pact问题:使用 Pact 进行消费者驱动的合同测试
【发布时间】:2020-06-08 09:37:29
【问题描述】:

我正在为一个大学项目编写一个小程序。 我想用协议框架来测试它。不幸的是,没有为我创建 Pact.json 文件,尽管没有错误。我的消费者是用 Javascript 编写的。 下面你可以看到我的 javascript 文件的源代码、控制台输出和我的 package.json 文件:

const {Pact} = require('@pact-foundation/pact');
const axios = require('axios');
const path = require('path');


describe('Pact Consumer', () => {
    const provider = new Pact({
        consumer: 'consumer',
        provider: 'producer',
        host:'127.0.0.1',
        port: 1234,
        log: path.resolve(process.cwd(), 'logs', 'pact.log'),
        dir: path.resolve(process.cwd(), 'pacts'),
        logLevel: 'INFO',
    });

    beforeAll(() => provider.setup());
    jasmine.DEFAULT_TIMEOUT_INTERVAL = 10000;
    describe('consumer', () => {

        beforeEach
        (() =>

            provider.addInteraction({
                state: "valid date",
                uponReceiving: "a request for JSON data",
                withRequest: {
                    method: "GET",
                    path: "/test",
                    headers: { Accept: "application/json" },
                },
                willRespondWith: {
                    status: 200,
                    headers: { "Content-Type": "application/json" },
                    body:
                        {
                            name: 'Scherr',
                            surname: 'Valerian',
                            age: 28,
                        },

                },


            }),


        );

    });



    describe('test', () => {
        it('should return the correct data', () => {

          return  axios.get('localhost:1234/test').then(response => {
                expect(response[0].name).toBe('Scherr');
                expect(response[0].surname).toBe('Valerian');
                expect(response[0].age).toBe(28);
            }).then(()=> provider.verify())
        });
    });

    afterAll(() => {
        return provider.finalize();
    });
});


控制台输出:

   Error: getaddrinfo ENOTFOUND 1234
Expected :
Actual   :
<Click to see difference>

error properties: Object({ errno: 'ENOTFOUND', code: 'ENOTFOUND', syscall: 'getaddrinfo', hostname: '1234', config: Object({ url: 'localhost:1234/test', method: 'get', headers: Object({ Accept: 'application/json, text/plain, */*', User-Agent: 'axios/0.19.2' }), transformRequest: [ Function ], transformResponse: [ Function ], timeout: 0, adapter: Function, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, validateStatus: Function, data: undefined }), request: Writable({ _writableState: WritableState({ objectMode: false, highWaterMark: 16384, finalCalled: false, needDrain: false, ending: false, ended: false, finished: false, destroyed: false, decodeStrings: true, defaultEncoding: 'utf8', length: 0, writing: false, corked: 0, sync: true, bufferProcessing: false, onwrite: Function, writecb: null, writelen: 0, afterWriteTickInfo: null, bufferedRequest: null, lastBufferedRequest: null, pendingcb: 0, prefinished: false, errorEmitted: false, emitClose: true, autoDestroy: false ...
Error: getaddrinfo ENOTFOUND 1234
    at GetAddrInfoReqWrap.onlookup [as oncomplete] (dns.js:64:26)

package.json:

{
  "name": "webservice",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "jasmine"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "@pact-foundation/pact": "^9.11.0",
    "@pact-foundation/pact-node": "^10.9.5",
    "axios": "^0.19.2",
    "jasmine": "^3.5.0"
  },
  "devDependencies": {
    "pact": "^4.3.2"
  }
}

感谢您的任何帮助并提前致谢

【问题讨论】:

    标签: javascript consumer pact contract


    【解决方案1】:

    如果没有日志,我无法判断,但有一件事是肯定的:您对 axios.getprovider.verify 的调用是承诺,并且不正确,这意味着某些事情的执行将出现故障或将根本没有真正执行。

    只需在两者前加上 return 前缀即可解决该问题。

    https://github.com/pact-foundation/pact-js#test-fails-when-it-should-pass

    【讨论】:

    • 您好,感谢您的快速帮助。我会直接说的。你是说日志文件吗?就在这里:I, [2020-06-08T14:18:16.805906 #11736] INFO -- : Verifying - interactions matched I, [2020-06-08T14:18:16.818918 #11736] INFO -- : Cleared interaction
    • 只有两句话
    • 它看起来好像认为1234是主机,所以你使用axios调用有问题。也许尝试localhost:1234 或阅读他们的文档以了解如何拨打电话
    • 我已经更新了上面的源代码和控制台输出,提前感谢
    • 现在当我使用摩卡而不是茉莉时它可以工作。谢谢你的帮助??
    【解决方案2】:

    我遇到了类似的问题。将provider config 上的cors 属性设置为true 为我完成了这项工作。

    在使用 node-fetch 而不是 axios 时,我似乎没有遇到这个问题。

    【讨论】:

      猜你喜欢
      • 2020-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-20
      相关资源
      最近更新 更多