Как заглушить обратный вызов метода модуля с помощью sinon? - PullRequest
0 голосов
/ 10 апреля 2020

Я использую модуль mv для перемещения файлов, старый модуль, который все еще загружается много раз и был полезен при работе с файлами между томами docker и за пределами docker. Я создал метод для обработки mv-метода как обещания.

При модульном тестировании я пытаюсь смоделировать mv при использовании внутри метода.

import mv from 'mv';

export class CmdUtils {
  /**
   * Move a file to a new location. Using mv, this will attempt a mv command, however
   * this could fail with docker volumes and will fallback to the mv module streaming
   * data to the new location as needed.
   * @param filePath - Full path to file
   * @param destinationFilePath - Full path to file's new destination
   */
  public static moveFile = (filePath: string, destinationFilePath: string): Promise<void> => {
    return new Promise((resolve, reject) => {
      mv(filePath, destinationFilePath, err => {
        if (!err) {
          resolve();
        } else {
          console.error('moveFile err', err);
          reject(err);
        }
      });
    });
  }
}

Вот начальный тест с пробелами :

import mv from 'mv';
import { CmdUtils } from './cmd-utils';

describe("CmdUtils: moveFile", () => {
  it("should successfully move a file using mv module", async () => {
    const sandbox = sinon.createSandbox();
    try {
      const moveFromPath = '/full/path/to/file.jpg';
      const moveToPath = '/full/path/to/destination/file.jpg';

      // Starting attempt at a replacement callback
      const mvCallback = (err: Error) => {
        if (!err) {
          Promise.resolve();
        } else {
          console.error('moveFile err', err.message);
          Promise.reject(err);
        }
      }

      // Stub mv
      sandbox.stub(mv)
      // What am I missing here?

      // Move file
      await CmdUtils.moveFile(moveFromPath, moveToPath);

      // expect no errors... (will revisit this)
    } finally {
      sandbox.restore();
    }
  });
});

Как смоделировать успешное перемещение файла? Я вижу похожие вопросы, но пока не могу найти ответ.

1 Ответ

1 голос
/ 10 апреля 2020
class CmdUtil {
  static moveFileCb(resolve, reject, err) {
    if (!err) {
      resolve('RESOLVED');
    } else {
      reject(err);
    }
  }

  static moveFile() {
    return new Promise((resolve, reject) => {
      mv('test', 'test', CmdUtil.moveFileCb.bind(this, resolve, reject))
    })
  }
}

тогда тест может быть чем-то похожим на то, что у вас там, где вы сейчас заглушаете moveFileCb. С помощью этой заглушки вы можете проверить / подтвердить, как вызывался обратный вызов, сколько раз он вызывался и т. Д. c.

. Примечание. Я не писал тест с использованием bind. Это может бросить ключ в решение.

...