Va bene simulare o stubare le librerie in lingue debolmente tipizzate?

2

Ho una certa esperienza con TDD in Java e Kotlin e attualmente provo ad imparare i test con Javascript.

Non sono sicuro che questa sia davvero una domanda sulla tipizzazione debole o strong o sulla progettazione generale.

Ho sempre avuto l'impressione che il codice di derisione / stubing che non possiedi sia una cattiva idea. In Kotlin vorrei creare e interfacciare la libreria e implementare quell'interfaccia con un wrapper.

Quindi iniettare una simulazione della mia interfaccia nei test.

In uno dei libri sto leggendo i suggerimenti per testare i percorsi di un'app express è di eseguire il stub della classe express.Router() :

const { expect } = require('chai');
const express = require('express');
const sinon = require('sinon');

describe('user routes', () => {
  var sandbox;
  var router;

  beforeEach(() => {
    sandbox = sinon.sandbox.create();
    sandbox.stub(express, 'Router').returns({
      get: sandbox.spy()
    });

    router = require('../src/routes/user');
  });

  afterEach(() => {
    sandbox.restore();
  });

  it('should register GET / route', () => {
    expect(router.get.calledWith('/', sandbox.match.any)).to.be.true;
  });
});

Il SUT è:

const express = require('express');

const router = express.Router();

router.get('/', (req, res) => {
  res.send("");
});

module.exports = router;

Va bene, o c'è un modo migliore per farlo?

    
posta Altoyr 24.01.2018 - 10:19
fonte

1 risposta

1

Come sottolinei, uno dei principali vantaggi del wrapping di una dipendenza esterna in un modulo che implementa un'interfaccia personalizzata è che puoi facilmente sostituirlo con un'implementazione fittizia.

Nelle lingue debolmente tipizzate, questo non è strettamente necessario. Potresti semplicemente usare una simulazione che fornisce la stessa API della libreria stessa. Ciò ti consente di risparmiare l'implementazione del wrapper.

Tuttavia, il test non è l'unico vantaggio che offre un wrapper:

  • Il wrapper protegge il resto dell'applicazione dalle modifiche nell'API della libreria

  • Puoi fornire solo le funzionalità di cui hai bisogno nel modo più adatto al consumatore

Se salti il wrapper, perdi anche tutti questi vantaggi. Personalmente, terrei l'involucro per queste ragioni. Ovviamente, non è necessario definire un'interfaccia in un linguaggio digitato in modo dinamico.

    
risposta data 24.01.2018 - 18:53
fonte

Leggi altre domande sui tag