Вы получаете это сообщение об ошибке, потому что вы настроили listenOnAMessageWithCallBack
шпиона на .withArgs('message')
, поэтому ваш шпион будет использоваться вместо этого метода только в том случае, если этот метод вызывается с аргументом 'message'
. Однако в вашем сервисном коде этот метод вызывается с 'catchUser'
и функцией обратного вызова, а не с 'message'
, поэтому ваш шпион никогда не вызывается. Если вы удалите условие .withArgs('message')
, ваш шпион будет вызываться независимо от аргументов, переданных фактическому методу.
Как только вы добьетесь того, что ваш шпион будет вызван, в функции callFake
шпиона вы сможете захватить обратный вызов, который передается в метод в коде вашего сервиса:
spyOn(electronController, 'listenOnAMessageWithCallBack').and.callFake(
(msg, cb) => {
expect(msg).toBe('catchUser');
expect(typeof cb).toBe('function');
// cb here is the cb being passed into listenOnAMessageWithCallBack in your service
// code, so you need to invoke it here yourself or the promise won't get resolved
cb('mockEvent', 'mockUsername');
}
);
Вы не можете по-настоящему смоделировать обратный вызов, потому что это локальная переменная в вашем сервисе, но так как вы можете получить удержание этого и вручную вызовите его в своем тесте, вы сможете проверить его эффекты.
Вам нужно будет точно определить, что вы ожидаете, что ваш код будет делать, потому что этот обратный вызов устанавливает service.username
на имя пользователя, переданное ему, но похоже, что в вашем тесте вы пытаетесь шпионить за service.stripDomain
и вместо этого установить service.username
. Похоже, вам нужно точно определить, что вы пытаетесь проверить здесь.
Вот блик стека , показывающий, как работает callFake
, и предоставляющий вам доступ к функции обратного вызова.