Sinon.stub.resolves возвращает неопределенное значение при ожидании в буфере.from

#javascript #node.js #async-await #sinon #stub

Вопрос:

У меня есть следующий код:

  describe('run()', () => {
    const ret = ['returnValue'];
    const expectedData = 'data';

    beforeEach(() => {
      sinon.stub(myStubbedService, 'myStubbedMethod').resolves(ret);
    });
    it('should not break', async () => {
      const foo = myStubbedService.myStubbedMethod();
      const bar = await myStubbedService.myStubbedMethod();
      const works = Buffer.from(bar[0], 'hex');
      console.log(works);
      const breaks = Buffer.from(await myStubbedService.myStubbedMethod()[0], 'hex');

      console.log(breaks);
    })
 

ведение works журнала регистрирует правильный буфер, но ведение breaks журнала =>

 TypeError [ERR_INVALID_ARG_TYPE]: The first argument must be of type string or an instance of Buffer, ArrayBuffer, or Array or an Array-like Object. Received undefined
 

Я почти уверен, что код для breaks работает точно так же, как и код для works , но тест не проходит. Чего мне не хватает?

Ответ №1:

На самом деле, ваш способ получить works это не то же самое, что breaks . Способ получения ответа works прост для понимания — дождитесь ответа myStubbedMethod , затем получите первый пункт ответа.

Взгляните на то, как вы получаете breaks :

 const breaks = Buffer.from(await myStubbedService.myStubbedMethod()[0], 'hex');
 

(Возможно) как вы знаете myStubbedService.myStubbedMethod() , возвращая a Promise , когда вы получаете 0 атрибут обещания, вы возвращаете неопределенное значение.
await с константой вы получаете константу.

Ваш код будет выглядеть следующим образом:

 const breaks = Buffer.from(await undefined, 'hex');
 

Просто больше скобок:

 const breaks = Buffer.from((await myStubbedService.myStubbedMethod())[0], 'hex');
 

Комментарии:

1. имеет смысл в холодном свете ретроспективы! Я думаю, что слишком долго смотрел на этот код. Еще раз спасибо!