with test react mock example create app javascript unit-testing reactjs redux sinon

javascript - test - redux mock store jest



Método de troceo en el mismo archivo usando Sinon (2)

Estoy tratando de probar una función en un archivo al unir otra función en el MISMO archivo, pero el simulacro no se está aplicando y se está llamando al método real. Aquí hay un ejemplo:

// file: ''foo.js'' export function a() { // ..... } export function b() { let stuff = a(); // call a // ...do stuff }

Y mi prueba:

import * as actions from ''foo''; const aStub = sinon.stub(actions, ''a'').returns(''mocked return''); actions.b(); // b() is executed, which calls a() instead of the expected aStub()


Algunas reestructuraciones pueden hacer que esto funcione.

He usado la sintaxis de commonJS. Debería funcionar de la misma manera en ES6 también.

foo.js

const factory = { a, b, } function a() { return 2; } function b() { return factory.a(); } module.exports = factory;

test.js

const ser = require(''./foo''); const sinon = require(''sinon''); const aStub = sinon.stub(ser, ''a'').returns(''mocked return''); console.log(ser.b()); console.log(aStub.callCount);

Salida

retorno burlado

1


Si bien lo anterior funciona, definitivamente es una solución ya que mi linter se apresuró a informar.

Terminé separando módulos y usando proxyquire . Esta biblioteca le permite sustituir fácilmente cualquiera / todas las exportaciones con las de su elección, sinon stub spy o burlas incluidas. p.ej :

en b.js

export const fnB = () => ''hey there!'';

en a.js

import { fbB } from ''b.js''; export const fnA = () => fbB();

en a.test.js

import { noCallThru } from ''proxyquire''; const proxyquireStrict = noCallThru(); const stubB = stub().returns(''forced result''); const moduleA = proxyquireStrict(''a.js'', { ''b.js'' : { fnB: stubB } }).fnA; console.log(fnA()); // ''forced result''