Шпаргалка по Jest (Stylesheet Jest)
Базовая структура теста
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <span class="pl-en">describe</span><span class="pl-kos">(</span><span class="pl-s">'Выбор цвета'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-en">beforeAll</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">/* Запускается перед всеми тестами */</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">afterAll</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">/* Запускается после всех тестов */</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">beforeEach</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">/* Запускается перед каждым тестом */</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">afterEach</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">/* Запускается после каждого теста */</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Выбираем цвет'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">actual</span> <span class="pl-c1">=</span> <span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">'Alice'</span><span class="pl-kos">,</span> <span class="pl-s">'Bob'</span><span class="pl-kos">,</span> <span class="pl-s">'John'</span><span class="pl-kos">]</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">actual</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">'Pink Alice'</span><span class="pl-kos">,</span> <span class="pl-s">'Pink Bob'</span><span class="pl-kos">,</span> <span class="pl-s">'Pink John'</span><span class="pl-kos">]</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Поиск совпадений
Использование поиска совпадений, официальная документация
Базовый поиск совпадений
1 2 3 4 5 | <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">42</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-c1">42</span><span class="pl-kos">)</span> <span class="pl-c">// Строгое равенство (===)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">42</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">not</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-c1">3</span><span class="pl-kos">)</span> <span class="pl-c">// Строгое неравенство (!==)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">]</span><span class="pl-kos">)</span> <span class="pl-c">// Глубокое сравнение</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c1">b</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">b</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-c">// Глубокое сравнение</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">undefined</span><span class="pl-kos">,</span> <span class="pl-c1">b</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">not</span><span class="pl-kos">.</span><span class="pl-en">toStrictEqual</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">b</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-c">// Строгое сравнение</span> |
Определение истинности
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="pl-c">// Совпадает с истинными значениями</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s">'foo'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeTruthy</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Совпадает с ложными значениями</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s">''</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeFalsy</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Совпадает только с `null`</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">null</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeNull</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Совпадает только с `undefined`</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">undefined</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeUndefined</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Значение должно быть определено</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">7</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeDefined</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Совпадает с `true` или `false`</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Boolean</span><span class="pl-kos">)</span><span class="pl-kos">)</span> |
Числа
1 2 3 4 5 6 | <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">2</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeGreaterThan</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeGreaterThanOrEqual</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeLessThan</span><span class="pl-kos">(</span><span class="pl-c1">2</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeLessThanOrEqual</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-c1">0.2</span> <span class="pl-c1">+</span> <span class="pl-c1">0.1</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeCloseTo</span><span class="pl-kos">(</span><span class="pl-c1">0.3</span><span class="pl-kos">,</span> <span class="pl-c1">5</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-v">NaN</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Number</span><span class="pl-kos">)</span><span class="pl-kos">)</span> |
Строки
1 2 3 4 5 | <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s">'длинная строка'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatch</span><span class="pl-kos">(</span><span class="pl-s">'стр'</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s">'строка'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">String</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s">'кофе'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatch</span><span class="pl-kos">(</span><span class="pl-pds">/ф/</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s">'пицца'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">not</span><span class="pl-kos">.</span><span class="pl-en">toMatch</span><span class="pl-kos">(</span><span class="pl-s">'кофе'</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">'пицца'</span><span class="pl-kos">,</span> <span class="pl-s">'кофе'</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">stringContaining</span><span class="pl-kos">(</span><span class="pl-s">'цц'</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">stringMatching</span><span class="pl-kos">(</span><span class="pl-pds">/ф/</span><span class="pl-kos">)</span><span class="pl-kos">]</span><span class="pl-kos">)</span> |
Массивы
1 2 3 4 5 | <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Array</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">'Alice'</span><span class="pl-kos">,</span> <span class="pl-s">'Bob'</span><span class="pl-kos">,</span> <span class="pl-s">'John'</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveLength</span><span class="pl-kos">(</span><span class="pl-c1">3</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">'Alice'</span><span class="pl-kos">,</span> <span class="pl-s">'Bob'</span><span class="pl-kos">,</span> <span class="pl-s">'John'</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toContain</span><span class="pl-kos">(</span><span class="pl-s">'Alice'</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toContainEqual</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">'Alice'</span><span class="pl-kos">,</span> <span class="pl-s">'Bob'</span><span class="pl-kos">,</span> <span class="pl-s">'John'</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">arrayContaining</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-s">'Alice'</span><span class="pl-kos">,</span> <span class="pl-s">'Bob'</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">)</span> |
Объекты
1 2 3 4 5 6 7 8 9 10 11 12 | <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveProperty</span><span class="pl-kos">(</span><span class="pl-s">'a'</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveProperty</span><span class="pl-kos">(</span><span class="pl-s">'a'</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-kos">{</span> <span class="pl-c1">b</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveProperty</span><span class="pl-kos">(</span><span class="pl-s">'a.b'</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">b</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatchObject</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">b</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatchObject</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Number</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-c1">b</span>: <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Number</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-c1">1</span> <span class="pl-kos">}</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">b</span>: <span class="pl-c1">2</span> <span class="pl-kos">}</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-kos">[</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">objectContaining</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">a</span>: <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Number</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">anything</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">]</span><span class="pl-kos">)</span> |
Исключения
1 2 3 4 | <span class="pl-c">// const fn = () => { throw new Error('Упс!') }</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toThrow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toThrow</span><span class="pl-kos">(</span><span class="pl-s">'Упс'</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toThrowErrorMatchingSnapshot</span><span class="pl-kos">(</span><span class="pl-kos">)</span> |
Снимки
1 2 3 4 5 | <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">node</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatchSnapshot</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">user</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatchSnapshot</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">date</span>: <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Date</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">user</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatchInlineSnapshot</span><span class="pl-kos">(</span><span class="pl-kos">)</span> |
Функция для создания «моков» (фикций)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="pl-c">// const fn = jest.fn()</span> <span class="pl-c">// const fn = jest.fn().mockName('Единорог') - именованная фикция</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeCalled</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Функция была вызвана</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">not</span><span class="pl-kos">.</span><span class="pl-en">toBeCalled</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Функция *не была* вызвана</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveBeenCalledTimes</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-c">// Функция была вызвана один раз</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeCalledWith</span><span class="pl-kos">(</span><span class="pl-s1">arg1</span><span class="pl-kos">,</span> <span class="pl-s1">arg2</span><span class="pl-kos">)</span> <span class="pl-c">// Любой вызов функции сопровождался указанными аргументами</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveBeenLastCalledWith</span><span class="pl-kos">(</span><span class="pl-s1">arg1</span><span class="pl-kos">,</span> <span class="pl-s1">arg2</span><span class="pl-kos">)</span> <span class="pl-c">// При последнем вызове функции, ей были переданы указанные аргументы</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveBeenNthCalledWith</span><span class="pl-kos">(</span><span class="pl-s1">args</span><span class="pl-kos">)</span> <span class="pl-c">// Определенный вызов функции сопровождался указанными аргументами</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveReturnedTimes</span><span class="pl-kos">(</span><span class="pl-c1">2</span><span class="pl-kos">)</span> <span class="pl-c">// Функция возвращает значения без ошибок</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveReturnedWith</span><span class="pl-kos">(</span><span class="pl-s1">value</span><span class="pl-kos">)</span> <span class="pl-c">// Функция возвращает указанное значение</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveLastReturnedWith</span><span class="pl-kos">(</span><span class="pl-s1">value</span><span class="pl-kos">)</span> <span class="pl-c">// Последний вызов функции вернул указанное значение</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveNthReturnedWith</span><span class="pl-kos">(</span><span class="pl-s1">value</span><span class="pl-kos">)</span> <span class="pl-c">// Определенный вызов функции вернул указанное значение</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">.</span><span class="pl-c1">mock</span><span class="pl-kos">.</span><span class="pl-c1">calls</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-kos">[</span><span class="pl-s">'first'</span><span class="pl-kos">,</span> <span class="pl-s">'call'</span><span class="pl-kos">,</span> <span class="pl-s">'args'</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-s">'second'</span><span class="pl-kos">,</span> <span class="pl-s">'call'</span><span class="pl-kos">,</span> <span class="pl-s">'args'</span><span class="pl-kos">]</span><span class="pl-kos">]</span><span class="pl-kos">)</span> <span class="pl-c">// Несколько вызовов</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">fn</span><span class="pl-kos">.</span><span class="pl-c1">mock</span><span class="pl-kos">.</span><span class="pl-c1">calls</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-c1">2</span><span class="pl-kos">)</span> <span class="pl-c">// fn.mock.calls[0][0] — первый аргумент первого вызова</span> |
toBeCalled
→toHaveBeenCalled
toBeCalledWith
→toHaveBeenCalledWith
lastCalledWith
→toHaveBeenLastCalledWith
nthCalledWith
→toHaveBeenNthCalledWith
toReturnTimes
→toHaveReturnedTimes
toReturnWith
→toHaveReturnedWith
lastReturnedWith
→toHaveLastReturnedWith
nthReturnedWith
→toHaveNthReturnedWith
Примеси
1 2 3 | <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-k">new</span> <span class="pl-v">A</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeInstanceOf</span><span class="pl-kos">(</span><span class="pl-v">A</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">any</span><span class="pl-kos">(</span><span class="pl-v">Function</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s">'пицца'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">anything</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">)</span> |
Поиск совпадений с промисами
1 2 3 4 5 6 7 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Разрешенным значением должен быть "лимон"'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">assertions</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-c">// Не забудьте добавить оператор `return`</span> <span class="pl-k">return</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-v">Promise</span><span class="pl-kos">.</span><span class="pl-en">resolve</span><span class="pl-kos">(</span><span class="pl-s">'лимон'</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">resolves</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-s">'лимон'</span><span class="pl-kos">)</span> <span class="pl-k">return</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-v">Promise</span><span class="pl-kos">.</span><span class="pl-en">reject</span><span class="pl-kos">(</span><span class="pl-s">'осьминог'</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">rejects</span><span class="pl-kos">.</span><span class="pl-en">toBeDefined</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-k">return</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-v">Promise</span><span class="pl-kos">.</span><span class="pl-en">reject</span><span class="pl-kos">(</span><span class="pl-v">Error</span><span class="pl-kos">(</span><span class="pl-s">'пицца'</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">rejects</span><span class="pl-kos">.</span><span class="pl-en">toThrow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Или с помощью async/await
:
1 2 3 4 5 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Разрешенным значением должен быть "лимон"'</span><span class="pl-kos">,</span> <span class="pl-k">async</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">assertions</span><span class="pl-kos">(</span><span class="pl-c1">2</span><span class="pl-kos">)</span> <span class="pl-k">await</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-v">Promise</span><span class="pl-kos">.</span><span class="pl-en">resolve</span><span class="pl-kos">(</span><span class="pl-s">'лимон'</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">resolves</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-s">'лимон'</span><span class="pl-kos">)</span> <span class="pl-k">await</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-v">Promise</span><span class="pl-kos">.</span><span class="pl-en">resolve</span><span class="pl-kos">(</span><span class="pl-s">'лимон'</span><span class="pl-kos">)</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-c1">resolves</span><span class="pl-kos">.</span><span class="pl-c1">not</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-s">'осьминог'</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Асинхронные тесты
Смотрите больше примеров в официальной документации Jest.
Хорошей практикой считается определение количества ожидаемых утверждений (assertions) в асинхронных тестах, тест провалится, если утверждения не будут вызваны.
1 2 3 4 5 6 7 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Асинхронный тест'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">assertions</span><span class="pl-kos">(</span><span class="pl-c1">3</span><span class="pl-kos">)</span> <span class="pl-c">// В процессе тестирования вызывается ровно три утверждения</span> <span class="pl-c">// или</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">hasAssertions</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// В процессе тестирования вызывается по крайней мере одно утверждение</span> <span class="pl-c">// Далее следуют асинхронные тесты</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Обратите внимание, что вы также можете делать это в файле, за пределами любых describe
и test
:
1 | <span class="pl-en">beforeEach</span><span class="pl-kos">(</span><span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-c1">hasAssertions</span><span class="pl-kos">)</span> |
Это обеспечит присутствие хотя бы одного утверждения в процессе тестирования. Это также подходит для случаев, когда ожидается конкретное число утверждений — expect.assertions(3)
.
async/await
1 2 3 4 5 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Асинхронный тест'</span><span class="pl-kos">,</span> <span class="pl-k">async</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">assertions</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-k">const</span> <span class="pl-s1">result</span> <span class="pl-c1">=</span> <span class="pl-k">await</span> <span class="pl-en">runAsyncOperation</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">result</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Промисы
1 2 3 4 5 6 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Асинхронный тест'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">assertions</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-k">return</span> <span class="pl-en">runAsyncOperation</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">then</span><span class="pl-kos">(</span><span class="pl-s1">result</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">result</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Коллбек done()
Утверждение должно быть обернуто в блок try/catch
, иначе Jest будет игнорировать ошибки:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Асинхронный тест'</span><span class="pl-kos">,</span> <span class="pl-s1">done</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">assertions</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-en">runAsyncOperation</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">setTimeout</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">try</span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">result</span> <span class="pl-c1">=</span> <span class="pl-en">getAsyncOperationResult</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">result</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span> <span class="pl-en">done</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-k">catch</span> <span class="pl-kos">(</span><span class="pl-s1">err</span><span class="pl-kos">)</span> <span class="pl-kos">{</span> <span class="pl-s1">done</span><span class="pl-kos">.</span><span class="pl-en">fail</span><span class="pl-kos">(</span><span class="pl-s1">err</span><span class="pl-kos">)</span> <span class="pl-kos">}</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Фикции
Функции для создания фикций
1 2 3 4 5 6 7 8 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Вызов коллбека'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">callback</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBeCalled</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">.</span><span class="pl-c1">mock</span><span class="pl-kos">.</span><span class="pl-c1">calls</span><span class="pl-kos">[</span><span class="pl-c1">0</span><span class="pl-kos">]</span><span class="pl-kos">[</span><span class="pl-c1">1</span><span class="pl-kos">]</span><span class="pl-kos">.</span><span class="pl-c1">baz</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-s">'пицца'</span><span class="pl-kos">)</span> <span class="pl-c">// Второй аргумент первого вызова</span> <span class="pl-c">// Отслеживаем первый и последний аргументы, но игнорируем второй</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveBeenLastCalledWith</span><span class="pl-kos">(</span><span class="pl-s">'мясо'</span><span class="pl-kos">,</span> <span class="pl-s1">expect</span><span class="pl-kos">.</span><span class="pl-en">anything</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">,</span> <span class="pl-s">'маргарита'</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Вы также можете использовать снимки:
1 2 3 4 5 6 7 8 9 | <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Вызов коллбека'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">callback</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockName</span><span class="pl-kos">(</span><span class="pl-s">'Единорог'</span><span class="pl-kos">)</span> <span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatchSnapshot</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// -></span> <span class="pl-c">// [MockFunction Единорог] {</span> <span class="pl-c">// "calls": Array [</span> <span class="pl-c">// ...</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
И передавать реализацию в функцию jest.fn()
:
1 | <span class="pl-k">const</span> <span class="pl-s1">callback</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-c1">true</span><span class="pl-kos">)</span> |
Возвращение, разрешение и отклонение значений
Ваши фикции могут возвращать значения:
1 2 | <span class="pl-k">const</span> <span class="pl-s1">callback</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockReturnValue</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">const</span> <span class="pl-s1">callbackOnce</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockReturnValueOnce</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">;</span> |
Или разрешать значения:
1 2 | <span class="pl-k">const</span> <span class="pl-s1">promise</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockResolvedValue</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">const</span> <span class="pl-s1">promiseOnce</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockResolvedValueOnce</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">;</span> |
Они даже могут отклонять значения:
1 2 | <span class="pl-k">const</span> <span class="pl-s1">failedPromise</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockRejectedValue</span><span class="pl-kos">(</span><span class="pl-s">"Роскосмос, у нас случилась оказия"</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-k">const</span> <span class="pl-s1">failedPromiseOnce</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockRejectedValueOnce</span><span class="pl-kos">(</span><span class="pl-s">"Роскосмос, у нас случилась оказия"</span><span class="pl-kos">)</span><span class="pl-kos">;</span> |
Вы можете комбинировать названные подходы:
1 2 3 4 5 6 7 | <span class="pl-k">const</span> <span class="pl-s1">callback</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">.</span><span class="pl-en">mockReturnValueOnce</span><span class="pl-kos">(</span><span class="pl-c1">false</span><span class="pl-kos">)</span> <span class="pl-kos">.</span><span class="pl-en">mockReturnValue</span><span class="pl-kos">(</span><span class="pl-c1">true</span><span class="pl-kos">)</span><span class="pl-kos">;</span> <span class="pl-c">// -></span> <span class="pl-c">// вызов 1: false</span> <span class="pl-c">// вызов 2+: true</span> |
Создание фиктивных модулей с помощью метода jest.mock()
1 2 | <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">mock</span><span class="pl-kos">(</span><span class="pl-s">'lodash/memoize'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-s1">a</span> <span class="pl-c1">=></span> <span class="pl-s1">a</span><span class="pl-kos">)</span> <span class="pl-c">// Должна присутствовать реальная функция lodash/memoize</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">mock</span><span class="pl-kos">(</span><span class="pl-s">'lodash/memoize'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-s1">a</span> <span class="pl-c1">=></span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">virtual</span>: <span class="pl-c1">true</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-c">// Реальная функция lodash/memoize может отсутствовать</span> |
Обратите внимание, при использовании babel-jest
вызовы jest.mock()
будут подниматься в начало блока кода. Используйте jest.doMock()
для предотвращения подобного поведения.
Создание фиктивных модулей в отдельных файлах
- Создаем файл, например,
__mocks__/lodash/memoize.js
:1<span class="pl-smi">module</span><span class="pl-kos">.</span><span class="pl-en">exports</span> <span class="pl-c1">=</span> <span class="pl-s1">a</span> <span class="pl-c1">=></span> <span class="pl-s1">a</span> - Добавлем его в тест:1<span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">mock</span><span class="pl-kos">(</span><span class="pl-s">'lodash/memoize'</span><span class="pl-kos">)</span>
Методы объектов фикций
1 2 3 | <span class="pl-k">const</span> <span class="pl-s1">spy</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">spyOn</span><span class="pl-kos">(</span><span class="pl-smi">console</span><span class="pl-kos">,</span> <span class="pl-s">'log'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockImplementation</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-smi">console</span><span class="pl-kos">.</span><span class="pl-c1">log</span><span class="pl-kos">.</span><span class="pl-c1">mock</span><span class="pl-kos">.</span><span class="pl-c1">calls</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toEqual</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-kos">[</span><span class="pl-s">'dope'</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-s">'nope'</span><span class="pl-kos">]</span><span class="pl-kos">]</span><span class="pl-kos">)</span> <span class="pl-s1">spy</span><span class="pl-kos">.</span><span class="pl-en">mockRestore</span><span class="pl-kos">(</span><span class="pl-kos">)</span> |
1 2 3 | <span class="pl-k">const</span> <span class="pl-s1">spy</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">spyOn</span><span class="pl-kos">(</span><span class="pl-s1">ajax</span><span class="pl-kos">,</span> <span class="pl-s">'request'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockImplementation</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-v">Promise</span><span class="pl-kos">.</span><span class="pl-en">resolve</span><span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-c1">success</span>: <span class="pl-c1">true</span> <span class="pl-kos">}</span><span class="pl-kos">)</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">spy</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveBeenCalled</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-s1">spy</span><span class="pl-kos">.</span><span class="pl-en">mockRestore</span><span class="pl-kos">(</span><span class="pl-kos">)</span> |
Геттеры и сеттеры фикций
Новая версия:
1 2 3 | <span class="pl-k">const</span> <span class="pl-s1">location</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span><span class="pl-kos">}</span> <span class="pl-k">const</span> <span class="pl-s1">getTitle</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">spyOn</span><span class="pl-kos">(</span><span class="pl-s1">location</span><span class="pl-kos">,</span> <span class="pl-s">'title'</span><span class="pl-kos">,</span> <span class="pl-s">'get'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockImplementation</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-s">'пицца'</span><span class="pl-kos">)</span> <span class="pl-k">const</span> <span class="pl-s1">setTitle</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">spyOn</span><span class="pl-kos">(</span><span class="pl-s1">location</span><span class="pl-kos">,</span> <span class="pl-s">'title'</span><span class="pl-kos">,</span> <span class="pl-s">'set'</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">mockImplementation</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span><span class="pl-kos">}</span><span class="pl-kos">)</span> |
Старая версия:
1 2 3 4 5 6 7 | <span class="pl-k">const</span> <span class="pl-s1">getTitle</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-s">'пицца'</span><span class="pl-kos">)</span> <span class="pl-k">const</span> <span class="pl-s1">setTitle</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-k">const</span> <span class="pl-s1">location</span> <span class="pl-c1">=</span> <span class="pl-kos">{</span><span class="pl-kos">}</span> <span class="pl-v">Object</span><span class="pl-kos">.</span><span class="pl-en">defineProperty</span><span class="pl-kos">(</span><span class="pl-s1">location</span><span class="pl-kos">,</span> <span class="pl-s">'title'</span><span class="pl-kos">,</span> <span class="pl-kos">{</span> <span class="pl-c1">get</span>: <span class="pl-s1">getTitle</span><span class="pl-kos">,</span> <span class="pl-c1">set</span>: <span class="pl-s1">setTitle</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Очистка и восстановление фикций
Для одной фикции:
1 2 3 | <span class="pl-s1">fn</span><span class="pl-kos">.</span><span class="pl-en">mockClear</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Удаляет дату использования фикции (fn.mock.calls, fn.mock.instances)</span> <span class="pl-s1">fn</span><span class="pl-kos">.</span><span class="pl-en">mockReset</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Удаляет любые возвращенные значения или реализации фикции</span> <span class="pl-s1">fn</span><span class="pl-kos">.</span><span class="pl-en">mockRestore</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Сбрасывает и восстанавливает первоначальную реализацию</span> |
Обратите внимание: mockRestore()
работает только применительно к фикциям, созданным с помощью jest.spyOn()
.
Для всех фикций:
1 2 3 | <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">clearAllMocks</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">resetAllMocks</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">restoreAllMocks</span><span class="pl-kos">(</span><span class="pl-kos">)</span> |
Получение доступа к исходному модулю при использовании «моков»
1 2 3 | <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">mock</span><span class="pl-kos">(</span><span class="pl-s">'fs'</span><span class="pl-kos">)</span> <span class="pl-k">const</span> <span class="pl-s1">fs</span> <span class="pl-c1">=</span> <span class="pl-en">require</span><span class="pl-kos">(</span><span class="pl-s">'fs'</span><span class="pl-kos">)</span> <span class="pl-c">// Модуль с "моком"</span> <span class="pl-k">const</span> <span class="pl-s1">fs</span> <span class="pl-c1">=</span> <span class="pl-en">require</span><span class="pl-kos">.</span><span class="pl-en">requireActual</span><span class="pl-kos">(</span><span class="pl-s">'fs'</span><span class="pl-kos">)</span> <span class="pl-c">// Исходный модуль</span> |
Фиктивные таймеры
Позволяет писать синхронные тесты для кода, в котором используются нативные таймеры (setTimeout
, setInterval
, clearTimeout
, clearInterval
).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="pl-c">// Разрешаем использование фиктивных таймеров</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">useFakeTimers</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Убить время'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">callback</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Запускаем код, в котором используются `setTimeout()` или `setInterval()`</span> <span class="pl-k">const</span> <span class="pl-s1">actual</span> <span class="pl-c1">=</span> <span class="pl-en">someFunctionThatUseTimers</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span> <span class="pl-c">// Перематываем до выполнения всех таймеров</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">runAllTimers</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Синхронно проверяем результаты</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveBeenCalledTimes</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Или настраиваем таймеры по времени с помощью advanceTimersByTime():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <span class="pl-c">// Разрешаем использование фиктивных таймеров</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">useFakeTimers</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'Убить время'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-k">const</span> <span class="pl-s1">callback</span> <span class="pl-c1">=</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">fn</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c">// Запускаем код, в котором используются `setTimeout()` или `setInterval()`</span> <span class="pl-k">const</span> <span class="pl-s1">actual</span> <span class="pl-c1">=</span> <span class="pl-en">someFunctionThatUseTimers</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span> <span class="pl-c">// Перематываем на 250 мс</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">advanceTimersByTime</span><span class="pl-kos">(</span><span class="pl-c1">250</span><span class="pl-kos">)</span> <span class="pl-c">// Синхронно проверяем результаты</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">callback</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toHaveBeenCalledTimes</span><span class="pl-kos">(</span><span class="pl-c1">1</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
В особых случаях используется jest.runOnlyPendingTimers().
Обратите внимание: jest.useFakeTimers()
следует вызывать только для использования других методов фиктивных таймеров.
Тестирование, основанное на данных
Запускаем одни и те же тесты с разными данными:
1 2 3 | <span class="pl-s1">test</span><span class="pl-kos">.</span><span class="pl-en">each</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-kos">[</span><span class="pl-c1">3</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-c1">3</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-c1">2</span><span class="pl-kos">,</span> <span class="pl-c1">1</span><span class="pl-kos">,</span> <span class="pl-c1">3</span><span class="pl-kos">]</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">(</span><span class="pl-s">'.add(%s, %s)'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-s1">b</span><span class="pl-kos">,</span> <span class="pl-s1">expected</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">a</span> <span class="pl-c1">+</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-s1">expected</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Или с помощью шаблонных литералов:
1 2 3 4 5 6 7 8 | <span class="pl-s1">test</span><span class="pl-kos">.</span><span class="pl-en">each</span><span class="pl-s">`</span> <span class="pl-s"> a | b | expected</span> <span class="pl-s"><span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">3</span><span class="pl-kos">}</span></span> | <span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">2</span><span class="pl-kos">}</span></span> | <span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">1</span><span class="pl-kos">}</span></span></span> <span class="pl-s"><span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">1</span><span class="pl-kos">}</span></span> | <span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">2</span><span class="pl-kos">}</span></span> | <span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">3</span><span class="pl-kos">}</span></span></span> <span class="pl-s"><span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">2</span><span class="pl-kos">}</span></span> | <span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">1</span><span class="pl-kos">}</span></span> | <span class="pl-s1"><span class="pl-kos">${</span><span class="pl-c1">3</span><span class="pl-kos">}</span></span></span> <span class="pl-s">`</span><span class="pl-kos">(</span><span class="pl-s">'Возвращает $expected при сложении $a и $b'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">{</span> <span class="pl-s1">a</span><span class="pl-kos">,</span> <span class="pl-s1">b</span><span class="pl-kos">,</span> <span class="pl-s1">expected</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">a</span> <span class="pl-c1">+</span> <span class="pl-s1">b</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toBe</span><span class="pl-kos">(</span><span class="pl-s1">expected</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Или на уровне describe
:
1 2 3 4 5 | <span class="pl-s1">describe</span><span class="pl-kos">.</span><span class="pl-en">each</span><span class="pl-kos">(</span><span class="pl-kos">[</span><span class="pl-kos">[</span><span class="pl-s">'mobile'</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-s">'tablet'</span><span class="pl-kos">]</span><span class="pl-kos">,</span> <span class="pl-kos">[</span><span class="pl-s">'desktop'</span><span class="pl-kos">]</span><span class="pl-kos">]</span><span class="pl-kos">)</span><span class="pl-kos">(</span><span class="pl-s">'проверка выполнения за %s'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-s1">viewport</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'отображение загруженной страницы'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">//</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Пропуск тестов. Шпаргалка по Jest.
Не запускать указанные тесты:
1 2 | <span class="pl-s1">describe</span><span class="pl-kos">.</span><span class="pl-c1">skip</span><span class="pl-kos">(</span><span class="pl-s">'makePoniesPink'</span><span class="pl-kos">.</span><span class="pl-kos">.</span><span class="pl-kos">.</span> <span class="pl-c1">tests</span><span class="pl-kos">.</span><span class="pl-c1">skip</span><span class="pl-kos">(</span><span class="pl-s">'сделать каждого пони розовым'</span><span class="pl-kos">.</span><span class="pl-kos">.</span><span class="pl-kos">.</span> |
Запускать только указанные тесты:
1 2 | <span class="pl-s1">describe</span><span class="pl-kos">.</span><span class="pl-c1">only</span><span class="pl-kos">(</span><span class="pl-s">'makePoniesPink'</span><span class="pl-kos">.</span><span class="pl-kos">.</span><span class="pl-kos">.</span> <span class="pl-c1">tests</span><span class="pl-kos">.</span><span class="pl-c1">only</span><span class="pl-kos">(</span><span class="pl-s">'сделать каждого пони розовым'</span><span class="pl-kos">.</span><span class="pl-kos">.</span><span class="pl-kos">.</span> |
Тестирование модулей с побочными эффектами
Node.js и Jest will кэшируют запрашиваемые (require
) модули. Для тестирования модулей с побочными эффектами необходимо очищать реестр модулей между тестами:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <span class="pl-k">const</span> <span class="pl-s1">modulePath</span> <span class="pl-c1">=</span> <span class="pl-s">'../module-to-test'</span> <span class="pl-en">afterEach</span><span class="pl-kos">(</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-s1">jest</span><span class="pl-kos">.</span><span class="pl-en">resetModules</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'первый тест'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">// Подготовка условия для первого теста</span> <span class="pl-k">const</span> <span class="pl-s1">result</span> <span class="pl-c1">=</span> <span class="pl-en">require</span><span class="pl-kos">(</span><span class="pl-s1">modulePath</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-s1">result</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toMatchSnapshot</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> <span class="pl-en">test</span><span class="pl-kos">(</span><span class="pl-s">'второй тест'</span><span class="pl-kos">,</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-kos">{</span> <span class="pl-c">// Подготовка условия для первого теста</span> <span class="pl-k">const</span> <span class="pl-en">fn</span> <span class="pl-c1">=</span> <span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-c1">=></span> <span class="pl-en">require</span><span class="pl-kos">(</span><span class="pl-s1">modulePath</span><span class="pl-kos">)</span> <span class="pl-en">expect</span><span class="pl-kos">(</span><span class="pl-en">fn</span><span class="pl-kos">)</span><span class="pl-kos">.</span><span class="pl-en">toThrow</span><span class="pl-kos">(</span><span class="pl-kos">)</span> <span class="pl-kos">}</span><span class="pl-kos">)</span> |
Возможно вам будет интересно — Шпаргалка по React- ответы на вопросы 2020-2021