Pregunta Stub moment.js constructor con Sinon


No puedo resguardar el moment constructor al llamarlo con el format función para devolver una cadena predefinida, aquí hay una especificación de ejemplo que me gustaría ejecutar con mocha:

it('should stub moment', sinon.test(function() {
  console.log('Real call:', moment());

  const formatForTheStub = 'DD-MM-YYYY [at] HH:mm';
  const momentStub = sinon.stub(moment(),'format')
                      .withArgs(formatForTheStub)
                      .returns('FOOBARBAZ');

  const dateValueAsString = '2025-06-01T00:00:00Z';

  const output = moment(dateValueAsString).format(formatForTheStub);

  console.log('Stub output:',output);
  expect(output).to.equal('FOOBARBAZ');

}));

Puedo ver esta salida usando console.log:

Real call: "1970-01-01T00:00:00.000Z"
Stub output: 01-06-2025 at 01:00

Pero luego la prueba falla causa 01-06-2025 at 01:00 !== 'FOOBARBAZ' ¿Cómo puedo resguardarlo adecuadamente? moment(something).format(...) ¿llamada?


10
2018-02-11 13:53


origen


Respuestas:


Encontré la respuesta en http://dancork.co.uk/2015/12/07/stubbing-moment/

Aparentemente el momento expone su prototipo usando .fn, así que puedes:

import { fn as momentProto } from 'moment'
import sinon from 'sinon'
import MyClass from 'my-class'

const sandbox = sinon.createSandbox()

describe('MyClass', () => {

  beforeEach(() => {
    sandbox.stub(momentProto, 'format')
    momentProto.format.withArgs('YYYY').returns(2015)
  })

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

  /* write some tests */

})

16
2018-05-17 19:08