Tengo problemas para tener una implementación única de búsqueda desde la configuración de patrón de este módulo que tengo (MyConnection.js); esto es similar a lo que tengo:
// MyConnection.js const MyConnection = () => { const search = async (q) => { //...some functionality }; return { search, }; }; //JEST TESTS const MyConnection = require('../MyConnection') // this works - but it sets the search implementation // for the whole test file I believe jest.mock('../MyConnection', () => { return jest.fn(()=>{ search: ()=> ['mocked', 'fn', 'results'] }) }) //the jest tests - I want different // implementations of search in each test describe('connection tests', ()=>{ it('test one', ()=>{ //Not sure if its something like this to set 'search' for each test? This doesn't work as is MyConnection.search.mockImplementation((q)=>{`You searched ${q}`}) }) it('test two', ()=>{ MyConnection.search.mockImplementation((q)={q.length>32? 'a': 'b' }}) }) })¿Cómo puedo obtener implementaciones simuladas de Jest únicas de esa función de búsqueda para cada prueba?
Debe asegurarse de que MyConnection siempre devuelva el mismo objeto de conexión en su archivo de prueba y el módulo que desea probar.
MyConnection.js :
const MyConnection = () => { const search = async (q) => {}; return { search, }; }; module.exports = MyConnection; main.js :
const MyConnection = require('./MyConnection'); async function main(q) { const conn = MyConnection(); return conn.search(q); } module.exports = main; main.test.js :
const MyConnection = require('./MyConnection'); const main = require('./main'); jest.mock('./MyConnection', () => { console.log('MyConnection module gets mocked'); const conn = { search: jest.fn() }; return jest.fn(() => conn); }); const mConn = MyConnection(); describe('connection tests', () => { it('test one', async () => { mConn.search.mockImplementation((q) => { return `You searched ${q}`; }); const actual = await main('teresa teng'); expect(actual).toBe('You searched teresa teng'); }); it('test two', async () => { mConn.search.mockImplementation((q) => { return q.length > 32 ? 'a' : 'b'; }); const actual = await main('_'); expect(actual).toBe('b'); }); });resultado de la prueba:
PASS examples/70132655/main.test.js (10.454 s) connection tests ✓ test one (2 ms) ✓ test two (1 ms) console.log MyConnection module gets mocked at examples/70132655/main.test.js:5:11 Test Suites: 1 passed, 1 total Tests: 2 passed, 2 total Snapshots: 0 total Time: 10.903 sNo puedes burlarte así:
jest.mock('./MyConnection', () => { console.log('MyConnection module gets mocked'); return jest.fn(() => { search: jest.fn() }); }); ¿Por qué? Porque cada vez que llama a la función MyConnection() en el archivo de prueba o el archivo que desea probar. Devolverá un nuevo objeto simulado ( { search: jest.fn() } ), los objetos simulados en el archivo bajo prueba y el caso de prueba no son los mismos.