Jest, тестирование асинхронного кода JS всегда терпит неудачу - PullRequest
0 голосов
/ 16 декабря 2018

Я пытаюсь протестировать мой скрипт app.js узла, в котором у меня есть асинхронный запрос sendMessageRequest () к функции sendSmtpMessage () [Обещание]

app.js

    const sendSmtpMessage = require("./sendSmtpMessage.js");

    const keys = {....};
    const mailOptions = {...}

    const sendMessageRequest = async () => {
      try {
        const result = await sendSmtpMessage(keys,mailOptions);
        console.log("... SEND MSG REQUEST FULLFILLED: ", result);
      } catch(err){
        console.log("... SEND MSG REQUEST FAILED: ");
      }
    };
    sendMessageRequest();

Я написал следующий app.spec.js, в соответствии с документом «Тестирование асинхронного кода» (с помощью async / await);но я предполагаю, что мой метод sendSmtpMessage () неправильный ...

app.spec.js

jest.mock("../sendSmtpMessage.js");
const sendSmtpMessage = require("../sendSmtpMessage.js");
const app = require("../app.js");

// sendSmtpMessage is a mock function
sendSmtpMessage.mockImplementation(() => {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      (oauth2ClientMock.refreshToken !== "undefined")? resolve() : reject()
      , 2000
    });
  })
});

describe('app', () => {
  let keys, mailOptions;
  beforeEach(() => {
    keys = {....};
    mailOptions = {....}
  });

  afterEach(() => {
    keys = {};
    mailOptions = {};
  });

  it("should call successfully sendMessageRequest", async () => {
    // GIVEN
    // WHEN
    // THEN
    expect.assertions(1);
    await expect(sendSmtpMessage).resolves.toBe("OK");
  });

  it("should call unsuccessfully sendMessageRequest", async () => {
    // GIVEN
    // WHEN
    keys.oauth.refresh_token = null;
    // THEN
    expect.assertions(1);
    await expect(sendSmtpMessage).rejects.toBeTruthy();
  });

});

Поскольку вывод console.log показывает ошибки на обоихожидания в каждом тесте (при разрешении и отклонении)

console.log

jest --detectOpenHandles --coverage "app.spec.js"

FAIL test / app.spec.js приложение ✕ должно успешно вызвать sendMessageRequest (15 мс) ✕ должно безуспешно вызвать sendMessageRequest (2 мс)

● приложение ›должно успешно вызвать sendMessageRequest

expect(received).resolves.toBe()

received value must be a Promise.
Received:
  function: [Function mockConstructor]

  52 |     // THEN
  53 |     expect.assertions(1);
> 54 |     await expect(sendSmtpMessage).resolves.toBe("OK");
     |                                            ^
  55 |   });
  56 |
  57 |   it("should call unsuccessfully sendMessageRequest", async () => {

  at Object.toBe (node_modules/expect/build/index.js:158:13)
  at Object.toBe (test/app.spec.js:54:44)

● приложение›Должен успешно вызвать sendMessageRequest

expect.assertions(1)

Expected one assertion to be called but received zero assertion calls.

  51 |     // WHEN
  52 |     // THEN
> 53 |     expect.assertions(1);
     |            ^
  54 |     await expect(sendSmtpMessage).resolves.toBe("OK");
  55 |   });
  56 |

  at Object.assertions (test/app.spec.js:53:12)

● приложение› должно безуспешно вызвать sendMessageRequest

expect(received).rejects.toBeTruthy()

received value must be a Promise.
Received:
  function: [Function mockConstructor]

  61 |     // THEN
  62 |     expect.assertions(1);
> 63 |     await expect(sendSmtpMessage).rejects.toBeTruthy();
     |                                           ^
  64 |   });
  65 |
  66 | });

  at Object.toBeTruthy (node_modules/expect/build/index.js:203:13)
  at Object.toBeTruthy (test/app.spec.js:63:43)

● приложение ›должно безуспешно вызвать sendMessageRequest

expect.assertions(1)

Expected one assertion to be called but received zero assertion calls.

  60 |     keys.oauth.refresh_token = null;
  61 |     // THEN
> 62 |     expect.assertions(1);
     |            ^
  63 |     await expect(sendSmtpMessage).rejects.toBeTruthy();
  64 |   });
  65 |

  at Object.assertions (test/app.spec.js:62:12)

Где я ошибаюсь?Я не очень хорошо понимаю процесс тестирования таких простых js-скриптов ... (используйте для работы с vue.js, test-utils ...)

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

1 Ответ

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

вы не ожидаете самого вызова метода sendMessageRequest

const sendSmtpMessage = require("./sendSmtpMessage.js");

        const keys = {....};
        const mailOptions = {...}

        const sendMessageRequest = async () => {
          try {
            const result = await sendSmtpMessage(keys,mailOptions);
            console.log("... SEND MSG REQUEST FULLFILLED: ", result);
          } catch(err){
            console.log("... SEND MSG REQUEST FAILED: ");
          }
        };

    (async function() {
      await sendMessageRequest();
    })();
...