开玩笑,测试异步JS代码总是失败

时间:2018-12-16 14:09:46

标签: javascript unit-testing async-await jestjs

我正在尝试测试节点app.js脚本,其中我对函数sendSmtpMessage()有一个异步请求sendMessageRequest()[一个承诺]

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();

根据有关测试异步代码(使用async / await)的文档,我编写了以下app.spec.js;但是我想我的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”

失败测试/app.spec.js   应用程式     ✕应该成功调用sendMessageRequest(15ms)     ✕应该调用失败sendMessageRequest(2ms)

●应用›应成功调用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 :(得分:0)

您不是在等待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();
    })();