[英]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答案我創建了一個回購來說明“挑戰”
您可以專門模擬由模擬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.