#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() }
), макетные объекты в тестируемом файле и тестовый случай не совпадают.