繁体   English   中英

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

[英]Jest , testing Asynchronous JS code always failing

我正在尝试测试我的节点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

开玩笑--detectOpenHandles --coverage“ app.spec.js”

失败test / 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一起使用...)

感谢您的反馈,并最终感谢您通过任何链接使我了解这种情况下的测试单元...

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM