当前位置: 首页 > 知识库问答 >
问题:

无法模拟外部节点模块

卓宏达
2023-03-14

我试图模拟一个外部模块(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'
   };
});
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 */ });
  // ...
});

我还发现了创建一个util的建议,该util可以在逐个测试的基础上更改全局localStorage,但我宁愿不使用真正的jsonwebtoken,或者不得不担心存储登录凭据。

最后,我总是发现jwt_decode在运行应该返回不同模拟值的测试时没有更新,或者更常见的是,我得到一个错误,说“.default不是一个函数”。

如果你有建议,我将不胜感激。

共有1个答案

汪茂
2023-03-14

假设我理解您的最终目标,那么这种方法怎么样:

在项目目录中,与node_modules相同的级别,创建一个名为“__mocks__”的目录,并在该目录中放置一个名为“jwt-decode.js”的文件--有了这个文件,就不需要在测试模块中显式地模拟jwt-decode,因为它总是会被自动模拟。

将以下代码放入__mocks__/jst_decode.js文件中:

export default token => token;
 类似资料:
  • 我得到了这个错误时,试图从另一个javascript文件导入。这是我第一次尝试这样的东西。主文件是,模块文件是。 main.js: 摩登派青年js: 我怎样才能解决这个问题?谢谢

  • 我试图在测试中模拟一个调用,但我得到了一个错误,因为它调用了真正的方法,而不是模拟它。 这是我的方法 } 这是我的测试课 测试实际上调用了受保护的方法config Setter,并在设置代理时失败。帮助我理解我在这里做错了什么。

  • 我正在使用TestNG编写单元测试。问题是当我模拟System.CurrentTimeMillis时,它返回的是实际值,而不是模拟的值。理想情况下,它应该返回0L,但它返回的是实际值。我该怎么做才能继续?

  • 问题内容: 我一直使用 ,安装在本地 的Windows Vista 的。我最近升级到(通过运行安装程序)。似乎它工作了一段时间,但是现在,如果我尝试从任何目录运行,我都会得到一个 无法将“节点”识别为内部或外部命令 消息,虽然运行从 做 工作。 我尝试重新启动,删除节点,重新安装,重新安装0.6.3-似乎没有任何效果。我只是不明白 为什么尽管无法识别系统路径,但可以从其基本目录运行? 问题答案:

  • 问题内容: 我有一个看起来像这样的网页 我的目标是让 div 在 文件输入_上引发click事件,这似乎完全符合我在IE和Chrome中的预期,但在Firefox中不起作用(当您单击Firefox时未打开文件浏览器) _div)。 有没有办法让它在FF中工作? 问题答案: 有没有办法让它在FF中工作? 不,它在大多数常见版本的IE中也不起作用。IE将打开该对话框,但是一旦选择了该文件,该窗体将不会

  • 上面还有第二个问题。当我在Expects块中定义mock类时(如上),似乎只调用了构造函数,而不是,因此没有正确初始化对象。我通过将它移到方法中并在那里实例化该类来解决这个问题。看起来是这样的: 因此,这似乎得到了要调用的正确构造函数,但似乎还在调用。有什么见解吗?