¿Qué es un stub en Node.js?

Una pequeña rutina de programa que sustituye a un programa más largo que se puede cargar más tarde o que se encuentra en una ubicación remota.

Características del talón:

  • Los talones pueden ser anónimos.
  • Los stubs se pueden envolver en funciones existentes. Cuando envolvemos un código auxiliar en la función existente, no se llama a la función original.
  • Los stubs son funciones o programas que afectan el comportamiento de componentes o módulos.
  • Los stubs son objetos ficticios para realizar pruebas.
  • Los stubs implementan una respuesta preprogramada.

Ejemplo:

var fs = require('fs')
var writeFileStub = sinon.stub(fs, 
    'writeFile', function (path, data, cb) {  
        return cb(null)
})
  
expect(writeFileStub).to.be.called  
writeFileStub.restore()  

¿Cuándo usar talones?

  1. Evita que se llame directamente a un método específico.
  2. Controlar el comportamiento del método por una ruta específica desde una prueba para forzar el código. Por ejemplo: Manejo de errores.
  3. Reemplazar las piezas de código problemáticas.
  4. Probar código asíncrono fácil.

Ejemplo para crear un código auxiliar asíncrono que lanza una excepción:

require("@fatso83/mini-mocha").install();
  
const sinon = require("sinon");
const PubSub = require("pubsub-js");
const referee = require("@sinonjs/referee");
const assert = referee.assert;
  
describe("PubSub", function() {
   it("Calling all the subscribers, 
     irrespective of exceptions.", function() {
       const message = "an example message";
       const stub = sinon.stub().throws();
       const spy1 = sinon.spy();
       const spy2 = sinon.spy();
       const clock = sinon.useFakeTimers();
  
       PubSub.subscribe(message, stub);
       PubSub.subscribe(message, spy1);
       PubSub.subscribe(message, spy2);
  
       assert.exception(()=>{
           PubSub.publishSync(message, "some data");      
           clock.tick(1);
       });
  
       assert.exception(stub);
       assert(spy1.called);
       assert(spy2.called);
       assert(stub.calledBefore(spy1));
  
       clock.restore();
   });
});

Producción:

Calling all the subscribers, irrespective of exceptions.

Ejemplo de talones: Consideremos un ejemplo de un sitio web de comercio electrónico para comprar artículos. Si tenemos éxito, se enviará un correo al cliente.

const purchaseItems(cartItems, user)=>{
   let payStatus = user.paymentMethod(cartItems)
   if (payStatus === "successful") {
     user.SuccessMail()
   } else {
     user.redirect("error_page_of_payment")
   }
 }
}
  
function() {
  
  // Mail will be send for successful payment.
  let paymentStub = sinon.stub().returns("successful")
  let mailStub = sinon.stub(
  let user = {
    paymentMethod: paymentStub,
    SuccessMail: mailStub
  }
  
  purchaseItems([], user)
   
  assert(mailStub.called)
}

Ejemplo 1: un ejemplo simple para ejecutar stubs.

<!DOCTYPE html>
<html>
  
<head>
    <title>Page Title</title>
</head>
  
<body>
    <div id="mocha"></div>
</body>
  
</html>
<!DOCTYPE html>
<html>
  
<head>
    <script>
        mocha.setup('bdd');
  
        function saveUser(user, callback) {
            $.post('/users', {
                first: user.firstname,
                last: user.lastname
            }, callback);
        }
  
        describe('saveUser', function () {
            it('should call callback after saving',
            function () {
  
                // We'll stub $.post so a 
                // request is not sent
                var post = sinon.stub($, 'post');
                post.yields();
  
                // We can use a spy as the callback 
                // so it's easy to verify
                var callback = sinon.spy();
  
                saveUser({ firstname: 'Han', 
                    lastname: 'Solo' }, callback);
  
                post.restore();
                sinon.assert.calledOnce(callback);
            });
        });
  
        mocha.run();
    </script>
</head>
  
</html>

Producción:

Ejemplo 2:

<!DOCTYPE html>
<html>
  
<head>
    <title>Page Title</title>
</head>
  
<body>
    <h1>GeeksForGeeks</h1>
    <div id="mocha"></div>
</body>
  
</html>
<!DOCTYPE html>
<html>
  
<head>
    <script>
        mocha.setup('bdd');
  
        function saveUser(user, callback) {
            $.post('/users', {
                first: user.firstname,
                last: user.lastname
            }, callback);
        }
  
        describe('saveUser', function () {
            it(
'It will send the correct parameters to the expected URL',
            function () {
  
                // We'll stub $.post same as before
                var post = sinon.stub($, 'post');
  
                // We'll set up some variables to 
                // contain the expected results
                var expectedUrl = '/users';
                var expectedParams = {
                    first: 'Expected first name',
                    last: 'Expected last name'
                };
  
                // We can also set up the user we'll
                // save based on the expected data
                var user = {
                    firstname: expectedParams.first,
                    lastname: expectedParams.last
                }
  
                saveUser(user, function () { });
                post.restore();
  
                sinon.assert.calledWith(post, 
                    expectedUrl, expectedParams);
            });
        });
  
        mocha.run();
    </script>
</head>
  
</html>

Producción:

Publicación traducida automáticamente

Artículo escrito por sharmaanushka y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *