Я расширю свой комментарий до фактического ответа, надеюсь, это поможет.
Ваша проблема связана с асинхронностью, а не с генератором.Вам нужен черный список, чтобы вернуть обещание, от которого вы можете ждать.В противном случае ваше утверждение произойдет до вызова шпиона.
Примерно так:
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);