【发布时间】:2021-11-24 23:46:36
【问题描述】:
我有一个 FooStorage 类,它有一个 Foo 对象数组作为成员变量。在测试FooStorage 时,我想模拟类Foo。
如ES6 Class Mocks 所述,在我的情况下,我只需要一个自动模拟。但是当我试图模拟这个类时,它似乎并没有成功。相反,当我尝试使用 mockClear() 重置模拟时,我收到一条错误消息。
以下是 jest 的代码和输出:
foo.js
class Foo {};
export default Foo;
foostorage.js
import Foo from "./foo.js";
class FooStorage {
constructor() {
this.storage = []; // Array of Foo objects
}
}
export default FooStorage;
foostorage.test.js
import Foo from "../src/foo.js";
import FooStorage from "../src/foostorage.js";
import { jest } from "@jest/globals";
jest.mock("../src/foo.js");
beforeEach(() => {
Foo.mockClear();
});
test("if the Foo constructor hasn`t been called", () => {
const storage = new FooStorage();
expect(Foo).not.toHaveBeenCalled();
});
output
if the Foo constructor hasn`t been called
TypeError: Foo.mockClear is not a function
7 |
8 | beforeEach(() => {
> 9 | Foo.mockClear();
| ^
10 | });
11 |
12 | test("if the Foo constructor hasn`t been called", () => {
at Object.<anonymous> (test/foostorage.test.js:9:6)
我已经尝试将jest.mock("../src/foo.js"); 放在import Foo from "../src/foo.js"; 之前,但问题没有解决。
编辑:
我正在使用 Jest v. 27.0.6 和 jest-environment-node v. 27.0.6 和 @types/jest v. 27.0.1。
我还使用了 nodejs 参数 --experimental-modules 和 --experimental-vm-modules,这样我就可以使用 ES6 导入。我不使用 Babel 或其他任何东西。只是普通的 JavaScript。
【问题讨论】:
-
您使用的是哪个笑话版本?您要在哪里测试它是 Javascript 中的普通项目吗?
-
我也使用 nodejs 参数 - 不要。确保您不遵循此处jestjs.io/docs/ecmascript-modules 的任何建议。这将使 Jest 以常规模式运行,这是答案所假定的。 .缺乏对本机 ESM 的 Jest 支持,并且会导致模拟问题。这就是文档中明确说明的内容,请注意,我们目前在 ESM 中不以干净的方式支持 jest.mock。
-
@EstusFlask 我改用
Babel,现在问题解决了。如果需要,您可以将您的评论作为答案发布或编辑您之前的评论,以便我将其标记为已接受的答案。
标签: javascript unit-testing ecmascript-6 jestjs mocking