Шпион Синон не регистрирует вызов в цикле генератора? - PullRequest
0 голосов
/ 11 декабря 2018

Я хочу проверить, вызывается ли фрагмент кода, поэтому я использую шпион-синон, чтобы утверждать это.Однако, похоже, что шпион не работает, несмотря на то, что console.logs показывает, что код был вызван правильно.

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

мой код (я взял краткость для краткости):

  isBlacklisted(release, jobUUID) {

    names.forEach((name) => {
      this._spawnPythonProcessGenerator(
        this.IS_BLACKLISTED_SCRIPT,
        name
      ).next().value
        .then((data) => {
          console.log(data);
        })
        .catch((err) => {
          this._errorEvent(release, name, err, jobUUID);
        });
    }, this);
  }

  _errorEvent(release, name, err, jobUUID) {
    console.log('got here');
  }

  *_spawnPythonProcessGenerator(scriptSrc, name) {
    const pythonProcess = this._childProcess.spawn(
      'python3',
      [...arguments]
    );
    yield new Promise((resolve, reject) => {
      pythonProcess.stderr.on('data', (err) => {
        reject(err.toString());
      });

      pythonProcess.stdout.on('data', (data) => {
        resolve(data.toString());
      });
    });
  }

и мои тесты:

const Blacklist = require('../../src/Blacklist2');
const childProcess = require('child_process');
const uuid = require('uuid/v4');

describe('Blacklist', () => {
  let blacklist;
  beforeEach(() => {
    blacklist = new Blacklist(childProcess);
    blacklist.IS_BLACKLISTED_SCRIPT = './test/helpers/good.py';
  });
  describe('isBlacklisted', () => {
    it('should call the _errorEvent for every name in a release when the blacklist application is not available', async () => {
      let release = {
        id: 1001,
        asset_controller: {
          id: 54321,
        },
        display_name: 'Blah',
        names: [
          {
            id: 2001,
            name: 'Blah',
          },
        ],
      };

      blacklist.IS_BLACKLISTED_SCRIPT = './test/helpers/'+ uuid() +'.py';


      const spy = sinon.spy(blacklist, '_errorEvent');
      blacklist.isBlacklisted(release, uuid());

      console.log(spy);
      sinon.assert.calledTwice(spy);
      spy.restore();
    });
  });
});

мои шпионские отчеты:

notCalled: true

1 Ответ

0 голосов
/ 11 декабря 2018

Я расширю свой комментарий до фактического ответа, надеюсь, это поможет.

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

Примерно так:

isBlacklisted(release, jobUUID) {
    let promises = names.map((name) => {
      return this._spawnPythonProcessGenerator(
        this.IS_BLACKLISTED_SCRIPT,
        name
      ).next().value
        .then((data) => {
          console.log(data);
        })
        .catch((err) => {
          this._errorEvent(release, name, err, jobUUID);
        });
    }, this);

    return Promise.all(promises);
}

Затем в вашем тесте:

return blacklist.isBlacklisted(release, uuid())
    .then(() => {
        sinon.assert.calledTwice(spy);
    });

Также ... Это нене относится к вашей проблеме, но ваш _spawnPythonProcessGenerator метод не должен быть генератором.Вы используете только его первое значение, вызывая next и вызывая все заново для каждого элемента массива.

Это будет работать так же, если вы уберете *, изменитьyield до return и пропустите .next().value при вызове.Вы также, вероятно, хотите переименовать его, потому что это не генератор.

_spawnPythonProcess(scriptSrc, name) {
    const pythonProcess = this._childProcess.spawn(
      'python3',
      [...arguments]
    );
    return new Promise((resolve, reject) => {
      pythonProcess.stderr.on('data', (err) => {
        reject(err.toString());
      });

      pythonProcess.stdout.on('data', (data) => {
        resolve(data.toString());
      });
    });
}

Когда вы его называете:

let promises = names.map((name) => {
  return this._spawnPythonProcess(
    this.IS_BLACKLISTED_SCRIPT,
    name
  )
    .then((data) => {
      console.log(data);
    })
    .catch((err) => {
      this._errorEvent(release, name, err, jobUUID);
    });
}, this);

return Promise.all(promises);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...