Я пытаюсь написать тест для функции с внутренним вызовом в энзиме и Синоне, но у меня возникают проблемы с внутренним вызовом.
Вот мой код:
Чат.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
Может ли кто-нибудь помочь мне понять, что я делаю неправильно?
Является ли Chat.js и ChatWindow одним и тем же компонентом? Не могли бы вы поделиться полным кодом компонента?
@etarhan это один и тот же компонент, я отредактировал этот пост
Вы случайно не оборачиваете компонент в HOC?
@DimitrisEfst Я пробовал так ... но кажется, что я сделал неправильно
@etarhan Для этой части, я думаю, нет HOC
Я вижу, что вы делаете следующее:
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' неопределенного, что я делаю неправильно
на самом деле я создаю экземпляр класса socketEvent в Chat.js с именем socketClient, а onSendMessage — это функция, определенная в классе socketEvent.
внутри wrapper.instance() у него есть функция sendMessage, и нет свойства с именем socketClient, поэтому wrapper.instance().socketclient не определен, я понимаю эту проблему и пытаюсь изменить его на исходный класс, const spy = sinon.spy(socketEvent, 'onSendMessage'). Теоретически, он должен успешно шпионить, но выдал ошибку «TypeError: Попытка обернуть неопределенное свойство onSendMessage как функцию»
@HungryBird onSendMessage — это не метод класса, а метод экземпляра. предполагая, что socketEvent - это имя вашего класса, вам сначала нужно создать его экземпляр с помощью new socketEvent()
да, вы правы, теперь шпионите успешно после того, как я его создал :) Вернемся к моему компоненту чата, когда я использую экземпляр компонента чата для вызова sendMessage, он все равно выдает TypeError: Cannot read property 'onSendMessage' of undefined :(
Попробуйте сначала инициализировать socketClient как sinon fn. Затем вызовите его экземпляр (и данные) и, в конце концов, экземпляр sendMessage. Надеюсь, что это работает. Это у меня в голове, я могу более подробно посмотреть чуть позже, если вы разберетесь с этим. Я на мобильном.