Как смоделировать ответ вложенного модуля в Node.js/Jest

Я хочу выдать ошибку в методе компонента, вызываемого из другого компонента, чем я тестирую

// Class1.js
class Class1 {
  getData() {
    return { data }
  }
}
module.exports = new Class1()

// Class2.js
class1 = require('./Class1')
class Class2 {
  getData() {
    try {
      let data = class1.getData()
      return { data }
    } catch (err) {
      return err
    }
  }
}
module.exports = new Class2()

// Class2.spec.js
const class1 = require('./Class1')
const class2 = require('./Class2')

test("Test Class2 catch block", () => {
  jest.spyOn(class1, 'getData').mockReturnValue(new Error("Error"))
  expect(class2.getData()).toEqual(Error("Error"));
})

Но jest.spyOn не ловит и выдает новую ошибку. Что я делаю не так? Мне нужно проверить блок catch в Class2

Пожалуйста, предоставьте stackoverflow.com/help/mcve, который может воспроизвести проблему. Вы используете getData как статический метод, но это метод экземпляра.

Estus Flask 11.12.2020 22:52

извините .. Я не включил module.exports только для того, чтобы упростить вопрос

VladP 11.12.2020 23:07

Вы не написали, в чем ошибка. Макет должен работать, за исключением того, что ваши ожидания неверны. Почему это должен быть экземпляр ошибки? Это будет работать как .mockReturnValue('foo) и .toEqual({ data: 'foo' })

Estus Flask 11.12.2020 23:12

Я ожидаю, что spyOn вернет новый экземпляр Error при вызове getData.. но он возвращает только {data}, поэтому он не попадает в блок catch метода Class2.getData

VladP 11.12.2020 23:14

Для блока catch сгенерируйте ошибку mockImplementation(() => throw Error('foo)) и перехватите ее expect(()=>class2.getData()).toThrow('foo'). Также этот try..catch - это noop.

Estus Flask 11.12.2020 23:40
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
5
137
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Модульное тестовое решение:

class1.js:

class Class1 {
  getData() {
    return { data };
  }
}
module.exports = new Class1();

class2.js:

const class1 = require('./class1');

class Class2 {
  getData() {
    try {
      let data = class1.getData();
      return { data };
    } catch (err) {
      return err;
    }
  }
}
module.exports = new Class2();

class2.test.js:

const class1 = require('./class1');
const class2 = require('./class2');

describe('65258975', () => {
  afterEach(() => {
    jest.restoreAllMocks();
  });
  test('Test Class2 catch block', () => {
    const getDataSpy = jest.spyOn(class1, 'getData').mockImplementationOnce(() => {
      throw new Error('Error');
    });
    const actual = class2.getData();
    expect(actual).toBeInstanceOf(Error);
    expect(actual.message).toEqual('Error');
    expect(getDataSpy).toBeCalledTimes(1);
  });

  test('should pass', () => {
    const getDataSpy = jest.spyOn(class1, 'getData').mockReturnValueOnce('teresa teng');
    const actual = class2.getData();
    expect(actual).toEqual({ data: 'teresa teng' });
    expect(getDataSpy).toBeCalledTimes(1);
  });
});

результат модульного теста:

 PASS  examples/65258975/class2.test.js
  65258975
    ✓ Test Class2 catch block (3 ms)
    ✓ should pass

-----------|---------|----------|---------|---------|-------------------
File       | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
-----------|---------|----------|---------|---------|-------------------
All files  |    87.5 |      100 |      50 |    87.5 |                   
 class1.js |      50 |      100 |       0 |      50 | 3                 
 class2.js |     100 |      100 |     100 |     100 |                   
-----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        5.976 s

исходный код: https://github.com/mrdulin/jest-v26-codelab/tree/main/examples/65258975

Другие вопросы по теме