Soy muy nuevo en Pact-js y en las pruebas de contrato. Haré todo lo posible para explicar mi problema. por ahora solo intento generar el contrato de consumo
aquí está mi proveedor de pactos:
export const provider = new Pact({ consumer: 'Users', provider: 'UsersService', port: 1234, log: path.resolve(process.cwd(), 'logs', 'pact.log'), pactfileWriteMode: 'overwrite', logLevel: "DEBUG", dir: path.resolve(process.cwd(), 'pacts'), });y aquí está mi prueba:
jest.mock("axios"); const EXPECTED_BODY = {...} describe("Pact tests axios", () => { describe("/GET login", () => { beforeAll(() => provider.setup()); afterEach(()=> provider.verify()) afterAll(() => provider.finalize()); it("should login user and response with user object", async () => { await provider.addInteraction({ state: 'user logged', uponReceiving: 'request logged user', withRequest: { method: 'GET', path: '/users/login', body: {username: "test", password: "11223344"}, }, willRespondWith: { status: 200, headers: { 'Content-Type': 'application/json', }, body: eachLike(EXPECTED_BODY), }, }); axios.get.mockResolvedValueOnce(EXPECTED_BODY); const loggedUser = await loginUser("test", "11223344") expect(axios.get).toHaveBeenCalledTimes(1) expect(axios.get).toHaveBeenLastCalledWith("http://localhost:8080/users/login", {"headers": {"Content-Type": "application/json"}, "params": {"password": "11223344", "username": "test"}}) expect(loggedUser).toEqual(EXPECTED_BODY) }) }); }) Debo decir que mi solicitud original toma dos parámetros nombre de username y password y devuelve un objeto que contiene toda la información de ese usuario, por supuesto, el usuario existe, si no, devuelve null
aquí está la función de llamada API si es necesario:
export default async function loginUser(username, password) { try{ return await axios.get(("http://localhost:8080/users/login"), { headers: { "Content-Type": "application/json" }, params: { username: username, password: password } }) }catch (e){ return null } }Pact espera que usted realmente haga la llamada al punto final del que se está burlando en Pact.
Solicitudes faltantes: GET /users/login
Este error dice "dijiste que harías una llamada GET a /users/login pero no la recibí".
jest.mock("axios");Parece que te estás burlando del cliente HTTP Axios. Ahora tiene un simulacro para lo que necesita enviar solicitudes al Pact Mock.
En una prueba de Pact, considérela como una prueba unitaria para su código de cliente de API. La solicitud real debe enviarse a Pact Mock y Pact verificará que se realizó la solicitud correcta y devolverá la respuesta simulada.
Así que la solución es simple:
loginUserlocalhost:1234 en lugar de la real antes de ejecutar las pruebas (NOTA: puede hacer que el pacto encuentre un puerto libre dinámicamente al no configurar la opción de port y tomar el host de la respuesta de la llamada setup() )