Модульный тест внутреннего вызова с Enzyme и Sinon

Я пытаюсь написать тест для функции с внутренним вызовом в энзиме и Синоне, но у меня возникают проблемы с внутренним вызовом.

Вот мой код:

Чат.js

sendMssage = text => {
    const { user } = this.props;
    let message = this.messageModel.normalize(text);

    this.socketClient.onSendMessage(message, user);
    this.addMessage(message);
  };

test.js

  it('should call sendMessage function', () => {
    const wrapper = shallow(<Chat />);
    const instance = wrapper.instance();
    sinon.spy(instance.socketClient(
    message,
    user,
  ));
    socketClicent.onSendMessage(message, user);
    Instance.sendMessage(message);
  });

Выдает ошибку:

instance.socketClient is not a function

Может ли кто-нибудь помочь мне понять, что я делаю неправильно?

Попробуйте сначала инициализировать socketClient как sinon fn. Затем вызовите его экземпляр (и данные) и, в конце концов, экземпляр sendMessage. Надеюсь, что это работает. Это у меня в голове, я могу более подробно посмотреть чуть позже, если вы разберетесь с этим. Я на мобильном.

user10104341 10.04.2019 13:00

Является ли Chat.js и ChatWindow одним и тем же компонентом? Не могли бы вы поделиться полным кодом компонента?

etarhan 10.04.2019 13:17

@etarhan это один и тот же компонент, я отредактировал этот пост

HungryBird 10.04.2019 13:19

Вы случайно не оборачиваете компонент в HOC?

etarhan 10.04.2019 13:20

@DimitrisEfst Я пробовал так ... но кажется, что я сделал неправильно

HungryBird 10.04.2019 13:22

@etarhan Для этой части, я думаю, нет HOC

HungryBird 10.04.2019 13:26
Поведение ключевого слова "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) для оценки ваших знаний,...
3
6
42
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я вижу, что вы делаете следующее:

sinon.spy(instance.socketClient(
  message,
  user,
));

Я предполагаю, что socketClient - это экземпляр объекта, а не функция, но я не могу быть уверен, не видя кода этой части.

Если вы думаете, что собираетесь шпионить за методом onSendMessage из socketClient. sinon.spy ожидает, что вы либо передадите функцию, либо объект + функцию (если вы пытаетесь шпионить за методом экземпляра). Попробуйте следующее:

sinon.spy(instance.socketClient, 'onSendMessage');

Полное решение:

it('should call sendMessage function', () => {
  const wrapper = shallow(<Chat user = {user} />);
  const instance = wrapper.instance();
  const socketClient = new socketEvent();
  const spy = sinon.spy(socketClient, 'onSendMessage');
  instance.socketClient = socketClient;
  instance.sendMessage(message);
  sinon.assert.calledWith(spy, message, user);
});

Привет, etarhan, спасибо за ваше решение, точно, я хочу шпионить за методом экземпляра, но когда я меняю свой код на это, возникает другая ошибка.... Не удается прочитать свойство 'onSendMessage' неопределенного, что я делаю неправильно

HungryBird 10.04.2019 14:30

на самом деле я создаю экземпляр класса socketEvent в Chat.js с именем socketClient, а onSendMessage — это функция, определенная в классе socketEvent.

HungryBird 10.04.2019 14:43

внутри wrapper.instance() у него есть функция sendMessage, и нет свойства с именем socketClient, поэтому wrapper.instance().socketclient не определен, я понимаю эту проблему и пытаюсь изменить его на исходный класс, const spy = sinon.spy(socketEvent, 'onSendMessage'). Теоретически, он должен успешно шпионить, но выдал ошибку «TypeError: Попытка обернуть неопределенное свойство onSendMessage как функцию»

HungryBird 10.04.2019 15:09

@HungryBird onSendMessage — это не метод класса, а метод экземпляра. предполагая, что socketEvent - это имя вашего класса, вам сначала нужно создать его экземпляр с помощью new socketEvent()

etarhan 10.04.2019 15:14

да, вы правы, теперь шпионите успешно после того, как я его создал :) Вернемся к моему компоненту чата, когда я использую экземпляр компонента чата для вызова sendMessage, он все равно выдает TypeError: Cannot read property 'onSendMessage' of undefined :(

HungryBird 10.04.2019 15:22

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