Шутка, издевающаяся над модулем с шаблоном модуля и обладающая уникальной функциональностью в каждом тесте

#javascript #unit-testing #jestjs

Вопрос:

У меня возникли проблемы с уникальной реализацией поиска из этой настройки шаблона модуля, которая у меня есть (MyConnection.js) — вот похоже на то, что у меня есть:

 // MyConnection.js const MyConnection = () =gt; {  const search = async (q) =gt; {  //...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', () =gt; {  return jest.fn(()=gt;{  search: ()=gt; ['mocked', 'fn', 'results']  }) })   //the jest tests - I want different  // implementations of search in each test describe('connection tests', ()=gt;{   it('test one', ()=gt;{   //Not sure if its something like this to set 'search' for each test? This doesn't work as is  MyConnection.search.mockImplementation((q)=gt;{`You searched ${q}`})  })   it('test two', ()=gt;{  MyConnection.search.mockImplementation((q)={q.lengthgt;32? 'a': 'b' }})  })  })  

Как я могу получить уникальные шутливые макетные реализации этой функции поиска для каждого теста?

Ответ №1:

Вы должны убедиться, что mock MyConnection всегда возвращает один и тот же объект подключения в вашем тестовом файле и модуле, который вы хотите протестировать.

MyConnection.js :

 const MyConnection = () =gt; {  const search = async (q) =gt; {};  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', () =gt; {  console.log('MyConnection module gets mocked');  const conn = { search: jest.fn() };  return jest.fn(() =gt; conn); }); const mConn = MyConnection();  describe('connection tests', () =gt; {  it('test one', async () =gt; {  mConn.search.mockImplementation((q) =gt; {  return `You searched ${q}`;  });  const actual = await main('teresa teng');  expect(actual).toBe('You searched teresa teng');  });   it('test two', async () =gt; {  mConn.search.mockImplementation((q) =gt; {  return q.length gt; 32 ? 'a' : 'b';  });  const actual = await main('_');  expect(actual).toBe('b');  }); });  

результат теста:

 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 s  

Вы не можете так издеваться над этим:

 jest.mock('./MyConnection', () =gt; {  console.log('MyConnection module gets mocked');  return jest.fn(() =gt; { search: jest.fn() }); });  

Почему? Потому что каждый раз, когда вы вызываете MyConnection() функцию в тестовом файле или файле, который вы хотите протестировать. Он вернет новый макет объекта( { search: jest.fn() } ), макетные объекты в тестируемом файле и тестовый случай не совпадают.