SpyOn над поддельным шутливым модулем - PullRequest
0 голосов
/ 12 июня 2018

У меня есть простой сервис, который мне нужен для модульного тестирования с использованием jest:

Суть кода такова:

 domtoimage.toBlob(node, {filter: filter})
    .then(function (blob) {
      FileSaver.saveAs(blob, fileName);
 });

Я написал свой модуль модульного тестирования как таковой:

import FileSaver from "file-saver";
import domtoimage from "dom-to-image";


jest.mock('dom-to-image', () => {
  return {
    toBlob: (arg)=>{
      let promise = new Promise((resolve, reject) => {
        resolve('myblob')
      });
      return promise;
    }
  }
});
jest.mock('file-saver', ()=>{
  return {
    saveAs: (blob, filename) =>{
      return filename;
    }
  }
});

И в моем тесте у меня есть следующий шпион, настроенный

const spy = jest.spyOn(FileSaver, 'saveAs');

и вызывающий мою тестовую функцию.

однако,оператор ожидаемого: expect(spy).toBeCalled() возвращает false:

expect(jest.fn()).toBeCalled()

Однако в веб-шторме, когда я отлаживаю модульный тест, я ясно вижу, что вызывается моя смоделированная функция (достигается точка останова внутри функции).

Чего мне не хватает?

Ответы [ 2 ]

0 голосов
/ 14 июня 2018

Так что для тех из вас, кто интересуется чем-то похожим ... моей проблемой (как я и подозревал) было обещание в domtoimage.toBlob(node, {filter: filter}).then()

по сути, обещание разрешалось после того, как прозвучало мое ожидание.

, чтобы решить эту проблему, я поместил свой expect за setTimeout, заставив его сработать после выполнения обещания.

 DownloadImage('x', 'name');
  //small timeout to resolve the promise inside downldimage function
  setTimeout(()=>{
    expect(FileSaver.saveAs).toHaveBeenCalledWith('myblob', fileName);
    done();
  }, 100);
0 голосов
/ 12 июня 2018

Предложение 1

Возможно, шпионы spyOn и модуля не очень хорошо играют вместе.Вы можете попробовать использовать jest.fn() непосредственно внутри макета модуля, например

jest.mock('file-saver', ()=>{
  return {
    saveAs: jest.fn((blob, filename) => {
      return filename;
    })
  }
});

, а затем

expect(FileSaver.saveAs).toBeCalled()

Не забудьте позвонить jest.clearAllMocks() или аналогичный междуtests.

Предложение 2 У меня были проблемы с jest.mock, который неожиданно работал с кешем модуля jest, особенно при работе с импортом синглтонов.Может быть, у вас есть эта проблема.если у file-saver и dom-to-image нет инициализированного состояния или побочных эффектов на время импорта, вы сможете поменять jest.mock на переопределения функций, которые вам нужно смоделировать.

beforeEach(() => {
  FileSaver.saveAs = jest.fn(...);
  domtoimage.toBlob = jest.fn(...);
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...