簡體   English   中英

無法模擬外部節點模塊

[英]Cannot mock external node module

我正在嘗試模擬一個外部模塊(對於那些有興趣的人來說是 jwt_decode),我已經看到了許多關於如何使用 Jest 在測試套件中的所有測試以及每個測試的基礎上模擬外部節點模塊的示例。

我已經能夠模擬依賴項,以便它模擬套件中所有測試的返回值,盡管我真正關心的是默認函數。

import jwt_decode from 'jwt-decode';

jest.mock('jwt-decode', () => jest.fn().mockReturnValue({
  exp: 12345,
  somethingElse: 'test_value'
}));

這很有效,但我想測試返回的令牌已過期的場景,以便我可以驗證在出現這種情況時是否已調度某些 Redux 操作。

import jwt_decode from 'jwt-decode';

const decoded = jwt_decode(localStorage.jwtToken);

// set user info and isAuthenticated
store.dispatch(setCurrentUser(decoded));

// this is the scenario I am looking to test
const currentTime = Date.now() / 1000;
if (decoded.exp < currentTime) {
  store.dispatch(logoutUser());
  store.dispatch(clearCurrentProfile());

  window.location.href = '/login';
}

我想為單個測試修改返回的模擬,以便我可以確保顯示的“if”語句等於 false,並執行代碼庫的其他部分。

怎么辦呢?

到目前為止,我嘗試過但失敗的一些示例包括:

test('some test that will use a different mock' () => {
  // re-assign value of the imported module using the its given alias
  jwt_decode = jest.fn().mockImplementation(() => {
    return {
      exp: 'something_different 9999999999',
      somethingElse: 'I_changed_too'
    };
  });
});

jwt_decode.default = jest.fn().mockImplementation(() => {
   return {
     exp: 'something_different 9999999999',
     somethingElse: 'I_changed_too'
   };
});

還有 jest.spyOn(),如this SO question中所示,以及 A Jar of Clay 對同一問題的回答,其中提出了以下內容:

import { funcToMock } from './somewhere';
jest.mock('./somewhere');

beforeEach(() => {
  funcToMock.mockImplementation(() => { /* default implementation */ });
});

test('case that needs a different implementation of funcToMock', () => {
  funcToMock.mockImplementation(() => { /* implementation specific to this test */ });
  // ...
});

我還發現了一個創建實用程序的建議,該實用程序在逐個測試的基礎上更改全局 localStorage ,但我寧願不使用真正的 jsonwebtoken,也不必擔心存儲登錄憑據。

我一直得到的結果是,在運行應該返回不同模擬值的測試時,jwt_decode 沒有更新,或者更常見的是我收到一條錯誤消息,指出“.default 不是函數”。

如果您有建議,我將不勝感激。

假設我了解您的最終目標,那么這種方法如何:

在您的項目目錄中,與 node_modules 處於同一級別,創建一個名為“__mocks__”的目錄,並在該目錄中放置一個名為“jwt-decode.js”的文件——有了這個就不需要顯式地模擬 jwt-在您的測試模塊中解碼,因為它總是會被自動模擬。

將以下代碼放入您的 __mocks__/jst_decode.js 文件中:

export default token => token;

因此,當您正在測試的代碼調用jwt_decode(something) ,返回值將與傳入的完全相同。

現在您可以編寫單元測試來測試您的模塊在給定令牌中各種有效或無效值的情況下的行為; 只需模擬模塊中的令牌值,您對 jwt_decode() 的模擬實現將簡單地傳遞它。

暫無
暫無

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

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