Модуль Mock Node с функцией обратного вызова - PullRequest
0 голосов
/ 16 июня 2020

У меня есть код, который использует s sh -exe c, модуль узла, в форме обратного вызова.

const sshExec = require('ssh-exec');

const myCodeThatUsesSshExec = (arg1,arg2,arg3) => new Promise((resolve, reject) => {
  sshExec('ls -lh', 'ubuntu@my-remote.com', function (err, stdout, stderr) {
  if(err) {
    reject(err);
  } else if(stderr) {
    reject(stderr);
  } else {
   // process stdout
   const results = process stdout into an array...
   resolve(results);
  }
})
});

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

const myCodeThatUsesSshExec = require('./my-code');
jest.mock('ssh-exec');

test('ssh test', async () => {
    const resp = `total 268K
-rw-rw-rw- 1 bob bob 369 Jun 12 15:00 Dockerfile
-rw-rw-rw- 1 bob bob 849 Jun 12 14:46 app.js
drwxr-xr-x 1 bob bob 4.0K Jun 12 10:01 bin
-rw-rw-rw- 1 bob bob 49 Jun 15 14:34 jest.config.js`;

  // I know this doesn't work, just trying to illustrate what I'm trying to do.
    sshExec.mockReturnValue(Promise.resolve(resp));

  const received = await myCodeThatUsesSshExec(1,2,3);
  expect(received).toEqual(['Dockerfile', 'app.js', 'bin', 'jest.config.js']);

});

Как издеваться над обратным вызовом s sh -exe c?

1 Ответ

1 голос
/ 16 июня 2020

Короткий ответ: вы не имитируете обратный вызов, потому что это часть темы, которую вы пытаетесь проверить. Ваш текущий тест не работает, потому что ssh-exec не возвращает обещание; он принимает и вызывает обратный вызов. В общем, тестовые двойники должны соответствовать интерфейсу того, что они заменяют.

Вместо этого используйте свой mocked ssh-exec для вызова real callback: *

В качестве альтернативы создайте свою собственную оболочку для ssh-exec, которая лучше соответствует вашему варианту использования:

const sshPromise = (...args) => new Promise((resolve, reject) => {
  sshExec(...args, (err, stdout, stderr) => {
    if (err) {
      reject(err);
    } else if (stderr) {
      reject(stderr);
    } else {
      resolve(stdout);
    }
  });
});

Теперь вы можете имитировать этот более простой интерфейс, которым вы владеете, и ваш исходный тест будет работать должным образом. .

Это также упрощает код потребления:

const myCodeThatUsesSshExec = (arg1, arg2, arg3) => sshPromise('ls -lh', 'ubuntu@my-remote.com')
  .then((stdout) => {
    // process stdout
    const results = process stdout into an array...
    return results;
  });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...