我的应用程序有一个正常运行的Jest/Flow设置。我们切换到TypeScript,我所有的测试都失败了。我把所有的东西都转换成.ts和.test.ts,并修复了所有的bug。由于某种原因,我的__mocks__
都不再使用了。(我不得不模拟一些自动锁失败的模块)
例如,下面的代码用于在任何需要的时候模拟电子,并允许代码调用模拟对话框,这样我就可以检查错误用例是否报告了错误。因为我转换为TypeScript,所以任何时候在测试中命中require ("electron")
,它都会失败,并说remote未定义。
例如)aFile.test.ts
import reportError from "../aFile.ts";
const { dialog } = require ("electron").remote;
describe ("reportError", () =>
{
test ("creates dialog", () =>
{
const title = "foo";
const message = "bar";
reportError (title, message);
expect (dialog.showErrorBox).toHaveBeenLastCalledWith (title, message);
});
});
例如)aFile.ts
const { dialog } = require ("electron").remote;
export default function reportError (title: string, message: string)
{
dialog.showErrorBox (title, message);
}
例如)__mocks__/electron.js
(节点模块的同级)module.exports = { remote: { dialog: { showErrorBox: jest.fn () } } };
我可以肯定mock没有被使用,因为当我向任何失败的.test.ts文件添加以下代码时,它就开始通过了:jest.mock ("electron", () => { return { remote: { dialog: { showErrorBox: jest.fn () } } } });
为什么TypeScript找不到我的__mocks__
?
2条答案
按热度按时间mwecs4sa1#
我使用了以下解决方法来解决此问题:
创建
mocks.js
:在package.json中,将其添加到jest部分(mocks.js所在的路径):
这将全局模拟electron和你在这里声明的任何其他模块,类似于拥有
__mocks__
文件夹。你可能会把每个模块放在它自己的文件中,然后添加到setupFiles数组中。yhived7q2#
类型脚本、模拟和ES模块
我遇到了这个问题,并解决了它- TypeScript使用
__mocks__
为node_modules
。我使用ES模块,虽然它是许多年后。由于当前的答案是一个变通方案,我想我应该提供自己的配置作为真正的解决方案。
我看到的错误
TypeError: localforage.getItem is not a function
基本上有很多东西是没有定义的。
工作配置
我想模拟
node_modules/localforage
中的node_module。使用此模块的文件使用导入此模块
import localforage from "localforage";
因此模拟必须有一个默认导出。
其他文件使用
import * as localforage from "localforage";
导入因此,这意味着我还必须创建named export(
export const someName
)。模拟文件的格式为
__mocks__/localforage.ts
测试只需运行:
而且很管用。
调试提示:
*检查你的模块是如何被导入的.
import name from module
?import * as name from module
?import { name } from module
?你的模拟必须提供和你的原始模块相同的导出。这是我怀疑大多数人都有问题的部分。node_modules
的__mocks__
需要位于同级目录中。