簡體   English   中英

使用Jest spyOn啟動的模塊

[英]Using Jest spyOn a module that is initiated

在ExpresS API中,我正在使用郵戳庫發送電子郵件,該電子郵件的發送過程如下:

var postmark = require("postmark");
var client = new postmark.Client("aaaa-bbbbb-cccc");

然后使用以下命令發送密碼重置郵件:

client.sendEmailWithTemplate(
    // Options here
);

現在,我想測試該函數是否已被調用,但是我很難找出如何對此進行模擬/間諜的方法。

我嘗試了以下(簡化)操作:

const request = require("supertest");
const app = require("../server/app");

const postmark = require("postmark");
jest.mock("postmark");

describe("API Tests", () => {
    test("it should give a reset link when requesting with existing e-mail address", () => {
        return request(app)
        .post("/api/auth/passwordreset")
        .send({
            email: "user1@test.test"
        })
        .then(response => {
            expect(postmark.Client).toHaveBeenCalled();
        });
    });

});

這可行,但是僅測試是否已使用郵戳,因為我不知道如何實際測試client.sendEmailWithTemplate方法

關於如何做到這一點的任何建議?

編輯:跟進@samanime答案我創建了一個回購來說明“挑戰”

https://github.com/Hyra/jest_test_example

您可以專門模擬由模擬postmark返回的Client函數,以返回具有模擬函數的對象。

開玩笑,你可以為特定的嘲諷代碼node_modules通過創建一個文件夾名為__mocks__在同一水平node_modules ,即

/project-root
  /node_modules
  /__mocks__

請注意,這是每邊兩個下划線。

在其中創建一個名為<package_name>.js的函數(在您的情況下為postmark.js )。 然后,當您使用mock時,它將加載該程序導出的任何內容。

在該文件中,您可以根據需要進行模擬。 這樣的事情可能會起作用:

// global jest
module.exports = {
  Client: jest.fn(() => ({
      sendEmailWithTemplate: jest.fn(() => {})
  }))
};

它不必這么緊湊,但是基本上它使postmark具有一個稱為Client的函數,該函數返回一個對象,該對象具有一個稱為sendEmailWithTemplate的函數,兩者都是模擬/間諜。

然后,您可以只檢查是否調用了postmark.Client.sendEmailWithTemplate

一個陷阱是,您需要確保在兩次測試之間重置所有這些。 您可以在beforeEach()手動執行此操作,但是如果要重用它,我想添加一個名為__reset()的附加函數,它將重置代碼並僅調用該函數:

// global jest
const mockedPostmark = {
  Client: jest.fn(() => ({
      sendEmailWithTemplate: jest.fn(() => {})
  }))
};

mockedPostmark.__reset = () => {
  mockedPostmark.Client.mockClear();
  mockedPostmark.Client.sendEmailWithTemplate.mockClear();
};

module.exports = mockedPostmark;

您也可以根據需要添加其他功能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM