Cómo usar Nock para interceptar las solicitudes independientemente del cuerpo -- javascript campo con node.js campo con testing campo con mocha.js campo con nock camp Relacionados El problema

How to use nock to intercept requests regardless of body


1
vote

problema

Español

Estoy tratando de usar Nock en mis pruebas para interceptar las llamadas de solicitud que estoy realizando desde el módulo nativo https en NODE.JS. I'm using Promise.all Para realizar dos solicitudes al servidor externo. Quiero que mis pruebas intercepten las llamadas y verifique algunos de los campos de formulario para asegurarse de que están llenados como quiero.

Tengo la configuración de mi clase a continuación (guardó las partes más relevantes del código):

  const archiver = require('archiver'); const { generateKeyPairSync } = require('crypto'); const FormData = require('form-data'); const fs = require('fs'); const https = require('https');  class Platform {   constructor() {     this.FILESTORE_USERNAME = process.env.FILESTORE_USERNAME;     this.FILESTORE_PASSWORD = process.env.FILESTORE_PASSWORD;   }    store(serviceName) {     const { publicKey, privateKey } = this._generateKeys();      return Promise.all([this._postKey(publicKey), this._postKey(privateKey)])       .then(() => {         return this._zipKeys(publicKey, privateKey, serviceName);       })       .catch((err) => {         throw err;       });   }    _postKey(key) {     const options = this._getOptions();     const keyName = (key.search(/(PUBLIC)/) !== -1) ? 'publicKey' : 'privateKey';     const form = new FormData();     form.append('file', key);     form.append('Name', keyName);     form.append('MimeMajor', 'application');     form.append('MimeMinor', 'x-pem-file');     form.append('Extension', (keyName == 'publicKey') ? 'pub' : '');     form.append('FileClass', 'MFS::File');     options.headers = form.getHeaders();     options.headers.Authorization = 'Basic ' + Buffer.from(this.FILESTORE_USERNAME + ':' + this.FILESTORE_PASSWORD).toString('base64');      return new Promise((resolve, reject) => {       let post = https.request(options, (res) => {         let data = '';         if (res.statusCode < 200 || res.statusCode > 299) {           reject(new Error('File Storage API returned a status code outside of acceptable range: ' + res.statusCode));         } else {           res.setEncoding('utf8');           res.on('data', (chunk) => {             data += chunk;           });            res.on('error', (err) => {             reject(err);           });            res.on('end', () => {             if (data) {               resolve(JSON.parse(data));             } else {               resolve();             }           });         }       });       post.on('error', (err) => {         reject(err);       });       form.pipe(post);       post.end();      });   }    _getOptions() {     return {       hostname: 'api.example.com',       path: '/media/files/',       method: 'POST',     };   } }  module.exports = Platform;   

y luego, mi código de prueba se parece a la siguiente. Estoy usando Mocha, Sinon, Chai, Sinon-Chai y Nock.

  const Platform = require('/usr/src/app/api/Services/Platform'); const crypto = require('crypto'); const fs = require('fs'); const nock = require('nock'); const yauzl = require('yauzl');  describe('Platform', function() {   let platform;   beforeEach(() => {     platform = new Platform();   });   afterEach(() => {     const list = fs.readdirSync('/usr/src/app/api/Services/data/');     list.forEach((file) => {       fs.unlink('/usr/src/app/api/Services/data/' + file, (err) => {         if (err) throw err;       });     });     nock.cleanAll();   });   after(() => {     nock.restore();   });   describe('store', function() {     it('should post each generated key to an external storage place', async function() {       this.timeout(5000);       // const stub = sinon.stub(platform, '_postKey').resolves();       const scope = nock('https://api.example.com')         .persist()         .post('/media/files/', (body) => {           // console.log(body);         })         .reply(200);        let serviceName = 'test';       let actual = await platform.store(serviceName)         .catch((err) => {           (() => { throw err; }).should.not.throw();         });        console.log(scope);       // expect(stub.callCount).to.equal(2);       expect(actual).to.be.a('string');       expect(actual).to.include(serviceName + '.zip');       // stub.reset();      });   }); });   

El problema que viene a través de este error que se lanza al ejecutar mis pruebas:

AssertionError: [Función] esperada no lanzar un error pero 'error: Nock: no coincide con el método de solicitud { n "": "POST", N "URL": " https://api.example.com/media/files/ ", n "encabezados": { n
"Tipo de contenido": "Multipart / Forma-Datos; Límite = ---------------------------- 363749230271182821931703 ", n
"Autorización": "Basic ABCDEF1224U38454857483HFJDHJGTUYRWYT =" N}, N "cuerpo": "------------------------------ 363749230271182821931703 r nContent-disposición: Formulario-Datos; Nombre = " File " r n r n ----- comienza el público KEY ----- nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq + QnVOYVjbrHIlAEsEoF nZ4sTvqiB3sJGwecNhmgrUp9U8oqgoB50aW6VMsL71ATRyq9b3vMQKpjbU3R2RcOF na6mlaBtBjxDGu2nEpGX ++ mtPCdD9HV7idvWgJ3XS0vGaCM // 8ukY + VLBc1IB8CHC NVJ + + 8YOD5Y9TbdpwXR 0zCaiHwwd8MHIo1kBmQulIL7Avtjh55OmQZZtjO525lbqa nWUZ24quDp38he2GjLDeTzHm9z1RjYJG6hS + Ui0s2xRUs6VAr7KFtiJmmjxPS9 / vZ nwQyFcz / R7AJKoEH8p7NE7nn / onbybJy + SWRxjXVH8afHkVoC65BiNoMiEzk1rIsx ns92woHnq227JzYwFYcLD0W + TYjtGCB8 + ks + QRIiV0pFJ3ja5VFIxjn9MxLntWcf2 nhsiYrmfJlqmpW1DMfZrtt41cJUFQwt7CpN72aix7btmd / q0syh6VVlQEHq / 0nDky nItv7dqyqZc9NNOMqK9 / kXWhbq5cwS21mm + kTGas5KSdeIR0LH7uVtivB + LKum14e nRDGascZcXZIVTbOeCxA6BD7LyaJPzXmlMy4spXlhGoDYyVRhpvv2K03Mg7ybiB4X nEL1oJtiCFkRX5LtRJv0PCRJjaa3UvfyIuz8bHK4ANxIZqcwZwER + g02gw8iqNfMa nDWXpfMJUU8TQuLGWZQaGJc8CAwEAAQ == n ----- END PÚBLICO Llave ----- n r n ---------------------------- 363749230271182821931703 r nContent-disposición: Formulario datos; Nombre = "nombre " r n r npublickey r n ------------------------------ 363749230271182821931703 r Ncontent-disposición: Formulario-Datos; NOMBRE = "MIMEMAJOR " r n r napplication r n ------------------------------ 363749230271182821931703 r Ncontent-disposición: Formulario-Datos; NOMBRE = "MIMEMINOR " R N R NX-PEM-FILE R N --------------------------- -363749230271182821931703 r Ncontent-disposición: Formulario-Datos; Nombre = "extensión " r n r npub r n ------------------------------ 363749230271182821931703 r Ncontent-disposición: Formulario-Datos; NOMBRE = "FILECLASS " R N R NMFS :: File R N ---------------------------- 363749230271182821931703 - r n " n} ' fue lanzado

¡Lo tomo, es porque Nock espera que me fleje el cuerpo por la solicitud para obtener una coincidencia correcta? ¿Hay alguna forma de buscar solicitudes hechas a esa dirección, independientemente del cuerpo, para poder hacer mis propias pruebas o lo que sea?

Original en ingles

I'm trying to use nock in my tests to intercept the request calls i'm making from the native https module in Node.js. I'm using Promise.all to make two requests to the external server. I want my tests to intercept the calls, and check some of the form fields to make sure they're filled in as i want.

I have my class setup below (kept the most relevant parts of code in):

const archiver = require('archiver'); const { generateKeyPairSync } = require('crypto'); const FormData = require('form-data'); const fs = require('fs'); const https = require('https');  class Platform {   constructor() {     this.FILESTORE_USERNAME = process.env.FILESTORE_USERNAME;     this.FILESTORE_PASSWORD = process.env.FILESTORE_PASSWORD;   }    store(serviceName) {     const { publicKey, privateKey } = this._generateKeys();      return Promise.all([this._postKey(publicKey), this._postKey(privateKey)])       .then(() => {         return this._zipKeys(publicKey, privateKey, serviceName);       })       .catch((err) => {         throw err;       });   }    _postKey(key) {     const options = this._getOptions();     const keyName = (key.search(/(PUBLIC)/) !== -1) ? 'publicKey' : 'privateKey';     const form = new FormData();     form.append('file', key);     form.append('Name', keyName);     form.append('MimeMajor', 'application');     form.append('MimeMinor', 'x-pem-file');     form.append('Extension', (keyName == 'publicKey') ? 'pub' : '');     form.append('FileClass', 'MFS::File');     options.headers = form.getHeaders();     options.headers.Authorization = 'Basic ' + Buffer.from(this.FILESTORE_USERNAME + ':' + this.FILESTORE_PASSWORD).toString('base64');      return new Promise((resolve, reject) => {       let post = https.request(options, (res) => {         let data = '';         if (res.statusCode < 200 || res.statusCode > 299) {           reject(new Error('File Storage API returned a status code outside of acceptable range: ' + res.statusCode));         } else {           res.setEncoding('utf8');           res.on('data', (chunk) => {             data += chunk;           });            res.on('error', (err) => {             reject(err);           });            res.on('end', () => {             if (data) {               resolve(JSON.parse(data));             } else {               resolve();             }           });         }       });       post.on('error', (err) => {         reject(err);       });       form.pipe(post);       post.end();      });   }    _getOptions() {     return {       hostname: 'api.example.com',       path: '/media/files/',       method: 'POST',     };   } }  module.exports = Platform; 

And then, my testing code looks like the below. I'm using mocha, sinon, chai, sinon-chai and nock.

const Platform = require('/usr/src/app/api/Services/Platform'); const crypto = require('crypto'); const fs = require('fs'); const nock = require('nock'); const yauzl = require('yauzl');  describe('Platform', function() {   let platform;   beforeEach(() => {     platform = new Platform();   });   afterEach(() => {     const list = fs.readdirSync('/usr/src/app/api/Services/data/');     list.forEach((file) => {       fs.unlink('/usr/src/app/api/Services/data/' + file, (err) => {         if (err) throw err;       });     });     nock.cleanAll();   });   after(() => {     nock.restore();   });   describe('store', function() {     it('should post each generated key to an external storage place', async function() {       this.timeout(5000);       // const stub = sinon.stub(platform, '_postKey').resolves();       const scope = nock('https://api.example.com')         .persist()         .post('/media/files/', (body) => {           // console.log(body);         })         .reply(200);        let serviceName = 'test';       let actual = await platform.store(serviceName)         .catch((err) => {           (() => { throw err; }).should.not.throw();         });        console.log(scope);       // expect(stub.callCount).to.equal(2);       expect(actual).to.be.a('string');       expect(actual).to.include(serviceName + '.zip');       // stub.reset();      });   }); }); 

The problem I am coming across is this error that is thrown when running my tests:

AssertionError: expected [Function] to not throw an error but 'Error: Nock: No match for request {\n "method": "POST",\n "url": "https://api.example.com/media/files/",\n "headers": {\n
"content-type": "multipart/form-data; boundary=--------------------------363749230271182821931703",\n
"authorization": "Basic abcdef1224u38454857483hfjdhjgtuyrwyt="\n },\n "body": "----------------------------363749230271182821931703\r\nContent-Disposition: form-data; name=\"file\"\r\n\r\n-----BEGIN PUBLIC KEY-----\nMIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAq+QnVOYVjbrHIlAEsEoF\nZ4sTvqiB3sJGwecNhmgrUp9U8oqgoB50aW6VMsL71ATRyq9b3vMQKpjbU3R2RcOF\na6mlaBtBjxDGu2nEpGX++mtPCdD9HV7idvWgJ3XS0vGaCM//8ukY+VLBc1IB8CHC\nVj+8YOD5Y9TbdpwXR+0zCaiHwwd8MHIo1kBmQulIL7Avtjh55OmQZZtjO525lbqa\nWUZ24quDp38he2GjLDeTzHm9z1RjYJG6hS+Ui0s2xRUs6VAr7KFtiJmmjxPS9/vZ\nwQyFcz/R7AJKoEH8p7NE7nn/onbybJy+SWRxjXVH8afHkVoC65BiNoMiEzk1rIsx\ns92woHnq227JzYwFYcLD0W+TYjtGCB8+ks+QRIiV0pFJ3ja5VFIxjn9MxLntWcf2\nhsiYrmfJlqmpW1DMfZrtt41cJUFQwt7CpN72aix7btmd/q0syh6VVlQEHq/0nDky\nItv7dqyqZc9NNOMqK9/kXWhbq5cwS21mm+kTGas5KSdeIR0LH7uVtivB+LKum14e\nRDGascZcXZIVTbOeCxA6BD7LyaJPzXmlMy4spXlhGoDYyVRhpvv2K03Mg7ybiB4X\nEL1oJtiCFkRX5LtRJv0PCRJjaa3UvfyIuz8bHK4ANxIZqcwZwER+g02gw8iqNfMa\nDWXpfMJUU8TQuLGWZQaGJc8CAwEAAQ==\n-----END PUBLIC KEY-----\n\r\n----------------------------363749230271182821931703\r\nContent-Disposition: form-data; name=\"Name\"\r\n\r\npublicKey\r\n----------------------------363749230271182821931703\r\nContent-Disposition: form-data; name=\"MimeMajor\"\r\n\r\napplication\r\n----------------------------363749230271182821931703\r\nContent-Disposition: form-data; name=\"MimeMinor\"\r\n\r\nx-pem-file\r\n----------------------------363749230271182821931703\r\nContent-Disposition: form-data; name=\"Extension\"\r\n\r\npub\r\n----------------------------363749230271182821931703\r\nContent-Disposition: form-data; name=\"FileClass\"\r\n\r\nMFS::File\r\n----------------------------363749230271182821931703--\r\n"\n}' was thrown

I take it it's because nock expects me to fake out the body for the request to get a correct match? Is there a way of just looking for requests made to that address, regardless of the body, so I can do my own tests or whatever.

              

Lista de respuestas

2
 
vote
vote
La mejor respuesta
 

Cuando el método post de un alcance de nock se pasa un segundo argumento, se utiliza para que coincida con el cuerpo de la solicitud.

Docs para especificar el cuerpo de la solicitud

En su prueba, está pasando una función como segundo argumento, pero no devuelve true , así que Nock no lo está considerando una coincidencia.

de los docs:

Función: Nock evaluará la función que proporciona el cuerpo de solicitud Objeto como primer argumento. Devuelve verdadero si se debe considerar un partido

Dado que su objetivo es afirmar los campos de formulario a solicitud, su mejor enfoque sería dejar la función allí, haga sus afirmaciones donde se encuentra la línea // console.log(body); , pero agregue PropelCollection::toArray()0 hasta el final de la función.

También podría devolver PropelCollection::toArray()1 o PropelCollection::toArray()2 Dependiendo de si sus campos de formulario coinciden con sus afirmaciones, pero en mi experiencia hace que la salida de error de la prueba se convoluje. Mi preferencia es usar el estándar PropelCollection::toArray()3 PropelCollection::toArray()4 Llamadas y deja que las afirmaciones de los errores de burbujas antes de Nock continúen con la solicitud de solicitud.

 

When the post method of a Nock Scope is passed a second argument, it is used to match against the body of the request.

Docs for specifying the request body

In your test, you're passing a function as the second argument, but not returning true so Nock is not considering it a match.

From the docs:

Function: nock will evaluate the function providing the request body object as first argument. Return true if it should be considered a match

Since your goal is to assert form fields on the request, your best approach would be to leave the function there, do your assertions where the // console.log(body); line is, but add return true; to the end of the function.

You could also return true or false depending on if your form fields match your assertions, but in my experience it makes the error output from the test convoluted. My preference is to use standard chai expect() calls and let the assertions bubble errors before Nock continues with request matching.

 
 

Relacionados problema

0  Pruebas de creadores de acción Redux Async con broma  ( Testing redux async action creators with jest ) 
Comencé a escribir pruebas para mi solicitud. Estoy tratando de crear prueba para los creadores Redux Async. El problema es cuando ejecuto la prueba, obteng...

1  Servicios de jabón burlonos con nock  ( Mocking soap services with nock ) 
Estoy trabajando en una aplicación web3 que se comunica con los servicios de SOAP, usando el módulo web14 para analizar JSON en una solicitud de SOAP váli...

8  Nock no está interceptando la llamada API en la prueba REDUX  ( Nock is not intercepting api call in redux test ) 
Estoy tratando de probar una llamada de API en una aplicación REDUX. El código casi sigue al patrón descrito en la sección Async Acción de los documentos RE...

0  ¿Cómo puedo probar una ruta con nock y solicitar una promesa cuando la URL contiene comillas simples?  ( How can i test a route with nock and request promise when the url contains singl ) 
Estoy tratando de probar una llamada de API usando Nock + Solicitud-Promise y estoy recibiendo un error porque las rutas no coinciden. El problema parece ser ...

13  nock no está interceptando mi solicitud  ( Nock is not intercepting my request ) 
Estoy tratando de crear algunas pruebas básicas utilizando Karma Server y Nock. Parece que Nock no está interceptando mis solicitudes en absoluto, ¿alguien ti...

7  ¿Cómo devolver el objeto en lugar de la cadena para una respuesta con Nock?  ( How to return object instead of string for response with nock ) 
Cuando lo solicite una solicitud con nock devuelve String < / Código> Resultado en lugar de Object Incluso con @import "bootstrap"; 0 : @import "bo...

3  Autorización de encabezados de nock prohibido  ( Nock headers authorization forbidden ) 
Estoy tratando de nock una solicitud de Axios. Me he burlado con éxito la solicitud de publicación, pero está enviando una solicitud de preflija de opciones. ...

0  Jest / Enzyme - ¿Cómo usar Nock Library con un componente de Tienda REDUX conectado?  ( Jest enzyme how to use nock library with a connected redux store component ) 
gol Queremos probar la llamada ASYNC, FetchReviews () en componentdidmount () en comentarios componente, y verifique si actualiza nuestra Review com...

1  Solicitudes de la red de titiriteros burlones en SUT  ( Mocking puppeteer network requests in sut ) 
¿Alguien sabe cómo simularse las solicitudes de red que los titiriteros lo hacen cuando se usa como parte del sistema en prueba (pero no para ejecutar la prue...

21  ¿Cómo probar el error en la solicitud con Nock?  ( How to test error in request with nock ) 
Quiero probar el error en una solicitud de solicitud. Estoy usando Nock en mis pruebas, ¿cómo puedo forzar a Nock para provocar un error? Quiero lograr una co...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos