Syam K
04/18/2023, 1:53 PMyarn test:consumer
yarn run v1.22.17
$ jest __tests__/contract/consumer --runInBand --setupFiles ./__tests__/helpers/pactSetup.js --setupTestFrameworkScriptFile=./__tests__/helpers/pactTestWrapper.js
RUNS __tests__/contract/consumer/ClientsConsumer.spec.js
[14:40:14.473] ERROR (23284): pact@11.0.2: Test failed for the following reasons:
Mock server failed with the following mismatches:
0) The following request was expected but not received:
Method: GET
Path: /api/employees
Headers:
Accept: application/json
\__tests__\contract\consumer\ClientsConsumer.spec.js:81
expect(response.headers['Content-Type']).toBe("application/json"); ^
TypeError: Cannot read properties of undefined (reading 'Content-Type')Jan KrĂłlikowski
04/18/2023, 1:56 PMresponse is instantiated? Is it something from Pact or your code? Could you share the test file?Syam K
04/18/2023, 1:57 PMdescribe("GET All Employees", () => {
provider
.given('I have a list of empoyees')
.uponReceiving('a request for getting all employees')
.withRequest({
method: 'GET',
path: '/api/employees',
headers: { Accept: 'application/json' },
})
.willRespondWith({
status: 200,
headers: { 'Content-Type': 'application/json' },
body: GET_EMPLOYEES_EXPECTED_BODY,
});
return provider.executeTest((mockserver) => {
console.log("mockserver.url: " + mockserver.url);
console.log("mockserver.port: " + mockserver.port);
const employeeService = new EmployeeService(mockserver.url, mockserver.port);
const response = employeeService.getEmployees();
console.log("response: " + response);
expect(response.headers['Content-Type']).toBe("application/json");
expect(response.data).toEqual(GET_EMPLOYEES_EXPECTED_BODY);
expect(response.status).toEqual(200);
});
});Syam K
04/18/2023, 1:57 PMclass EmployeeService {
constructor(baseUrl, port) {
this.baseUrl = baseUrl;
this.port = port;
}
getEmployees = async () => {
const response = await axios.get(`${this.baseUrl}:${this.port}/api/employees`).then((res) => {
return res
})
.catch((error) => {
console.log("Exception while fetching the employees");
return error.res
})
// console.log("response header: " + response.headers['content-type']);
return response
};Syam K
04/18/2023, 1:58 PMglobal.port = 8081
global.provider = new PactV3({
port: global.port,
log: path.resolve(process.cwd(), "__tests__/contract/logs", "mockserver-integration.log"),
dir: path.resolve(process.cwd(), "__tests__/contract/pacts"),
spec: 2,
logLevel: 'INFO',
pactfileWriteMode: "overwrite",
consumer: "Frontend",
provider: "EmployeeService",
})Jan KrĂłlikowski
04/18/2023, 1:58 PMawait before calling getEmployeesSyam K
04/18/2023, 1:58 PMSyam K
04/18/2023, 2:01 PMreturn provider.executeTest(async(mockserver) => {
const employeeService = new EmployeeService(mockserver.url, mockserver.port);
const response = await employeeService.getEmployees();
expect(await response.headers['Content-Type']).toBe("application/json");
expect(await response.data).toEqual(GET_EMPLOYEES_EXPECTED_BODY);
expect(await response.status).toEqual(200);
});Jan KrĂłlikowski
04/18/2023, 2:07 PMconsole.log the response in the test? Maybe the request isnât fired at all.Syam K
04/18/2023, 2:08 PMSyam K
04/18/2023, 2:09 PMJan KrĂłlikowski
04/18/2023, 2:14 PMawait to the response in the except methods? Thatâs not how it should work đ it should be plain javascript object here, so no need for await hereSyam K
04/18/2023, 2:16 PMconst employeeService = new EmployeeService(mockserver.url, mockserver.port);
const response = await employeeService.getEmployees();
expect(response.headers['Content-Type']).toBe("application/json");
expect(response.data).toEqual(GET_EMPLOYEES_EXPECTED_BODY);
expect(response.status).toEqual(200);Syam K
04/18/2023, 2:16 PMJan KrĂłlikowski
04/18/2023, 2:18 PMTypeError: Cannot read properties of undefined (reading 'Content-Type')Syam K
04/18/2023, 2:19 PMexpect(response.headers['Content-Type']).toBe("application/json");
^
TypeError: Cannot read properties of undefined (reading 'headers')Jan KrĂłlikowski
04/18/2023, 2:19 PMJan KrĂłlikowski
04/18/2023, 2:19 PMSyam K
04/18/2023, 2:20 PMSyam K
04/18/2023, 2:20 PM//import axios from "axios";
import axios from "axios";
//const baseURL = "<http://localhost:8080>";
class EmployeeService {
constructor(baseUrl, port) {
this.baseUrl = baseUrl;
this.port = port;
}
getEmployees = async () => {
const response = await axios.get(`${this.baseUrl}:${this.port}/api/employees`).then((res) => {
return res
})
.catch((error) => {
console.log("Exception while fetching the employees");
return error.res
})
// console.log("response header: " + response.headers['content-type']);
return response
};
}
export default EmployeeService;Syam K
04/18/2023, 2:20 PMJan KrĂłlikowski
04/18/2023, 2:20 PMthen and catch parts from the call:
getEmployees = async () => {
const response = await axios.get(`${this.baseUrl}:${this.port}/api/employees`)
return response
};Jan KrĂłlikowski
04/18/2023, 2:20 PMgetEmployees method?Syam K
04/18/2023, 2:21 PMSyam K
04/18/2023, 2:24 PMgetEmployees = async () => {
return axios.request({
baseURL: this.url,
headers: { Accept: 'application/json' },
method: 'GET',
url: '/api/employees',
});
};Syam K
04/18/2023, 2:25 PMTest suite failed to run
Your test suite must contain at least one test.
at onResult (node_modules/@jest/core/build/TestScheduler.js:173:18)
console.log
â Test suite failed to run
Returning a Promise from "describe" is not supported. Tests must be defined synchronously.
Returning a value from "describe" will fail the test in a future version of Jest.
42 | // afterEach(() => provider.verify())
43 |
> 44 | describe("GET All Employees", async () => {
| ^
45 |
46 | provider
47 | .given('I have a list of empoyees')Jan KrĂłlikowski
04/18/2023, 2:26 PMtest method here, within describe. Or rename describe to test, that should work as well.Syam K
04/18/2023, 2:30 PMTest suite failed to run
TypeError: provider.finalize is not a function
5 | afterEach(() => provider.verify()); // Ensure the mock provider verifies expected interactions for each test
6 |
> 7 | afterAll(() => provider.finalize())
| ^
at Object.<anonymous> (__tests__/helpers/pactTestWrapper.js:7:25)Jan KrĂłlikowski
04/18/2023, 2:31 PMSyam K
04/18/2023, 2:38 PM// beforeAll(() => provider.setup())
// afterEach(() => provider.verify());
// afterAll(() => provider.finalize())Syam K
04/18/2023, 2:38 PMEmployee Clients Service
Tests cannot be nested.Syam K
04/18/2023, 2:39 PMSyam K
04/18/2023, 2:40 PMEmployee Clients Service âș GET All Employees
AxiosError: Network Error
at XMLHttpRequest.handleError (node_modules/axios/lib/adapters/xhr.js:154:14)
at XMLHttpRequest.<anonymous> (node_modules/jsdom/lib/jsdom/living/helpers/create-event-accessor.js:33:32)
at innerInvokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:316:27)
at invokeEventListeners (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:267:3)
at XMLHttpRequestEventTargetImpl._dispatch (node_modules/jsdom/lib/jsdom/living/events/EventTarget-impl.js:214:9)
at fireAnEvent (node_modules/jsdom/lib/jsdom/living/helpers/events.js:17:36)
at requestErrorSteps (node_modules/jsdom/lib/jsdom/living/xhr-utils.js:121:3)
at Object.dispatchError (node_modules/jsdom/lib/jsdom/living/xhr-utils.js:51:3)
at Request.<anonymous> (node_modules/jsdom/lib/jsdom/living/xmlhttprequest.js:675:20)
at Request.onRequestError (node_modules/request/request.js:877:8)
Test Suites: 1 failed, 1 total
Tests: 1 failed, 1 total
Snapshots: 0 total
Time: 10.534s
Ran all test suites matching /__tests__\\contract\\consumer/i.
console.error
Error: Error: connect ECONNREFUSED ::1:80Jan KrĂłlikowski
04/18/2023, 2:42 PMJan KrĂłlikowski
04/18/2023, 2:42 PMSyam K
04/18/2023, 2:43 PMYousaf Nabi (pactflow.io)
Yousaf Nabi (pactflow.io)
Timothy Jones
04/18/2023, 9:32 PMTimothy Jones
04/18/2023, 9:34 PMTimothy Jones
04/18/2023, 11:04 PMit function async or return a promise from the test function.
2) You canât currently make that change, as the order of `test`/`it` and describe blocks is not correct. Without seeing your full code, itâs hard to advise, but in general: you can have multiple describes (even nested), but you must only have one test or it, and it must not have describe inside it. Check the documentation for your test runner (Jest or Mocha, probably?) for more information.
3) Your code is not calling the mock correctly, and youâre getting an error response back, which was originally returning undefined because of the catch block returning error.res, which doesnât exist on an AxiosError: Network Error. This is why Jan suggested removing the catch - long term, youâll want to improve the error handler in your code. Check the axios error handling docs for an example.
As to why it is getting a network error, I would try printing out ${this.baseUrl}:${this.port}/api/employees in your EmployeeService to check that it is reasonable - although I suspect it will start working once your `await`s are in the right place.Syam K
04/19/2023, 1:52 PMJan KrĂłlikowski
04/19/2023, 1:53 PM