我正在使用笑话
29.7.0
我有一个名为
message.js
的模块,带有
export async function send() {...}
然后这个模块在另一个文件中使用
handler.js
import {send} from './message.js'
export default async function handle(){
// Do stuf
await send()
// More stuf
}
然后在我的测试中我想模拟
send
函数。
我尝试过
import { jest } from '@jest/globals'
import handle from "../../handler.js"
import * as message from "../../message.js"
it("Should test handle", function(){
const spy = jest.spyOn(message, 'send').mockImplementationOnce(() => Promise.resolve());
await handle();
expect(spy).toHaveBeenCalled()
})
但是
spyOn
正在投掷 TypeError: Cannot assign to read only property 'send' of object '[object Module]'
我也尝试过
message.send = jest.fn();
但是我也有同样的问题
我也尝试添加
jest.mock('../../message.js', () => ({
__esModule: true,
send: jest.fn(()=>Promise.resolve('mocked')),
}));
导入之后、导入之前、测试中、之前
但在每种情况下我都有同样的问题打电话给
message .send.mockReturnValue(Promise.resolve)
TypeError: message.send.mockReturnValue is not a function
删除
message.send.mockReturnValue
模拟函数不会被调用,而是原始函数会被调用。
我也尝试过
Object.defineProperty(message, "send", {
value: jest.fn(),
configurable: true,
writable: true
});
在调用
jest.spyOn
之前,但它抛出 TypeError: Cannot redefine property: send
我正在使用以下命令运行 jest
NODE_OPTIONS=\"$NODE_OPTIONS --experimental-vm-modules\" jest
我找到了解决方案。
以下测试代码有效
import { jest } from '@jest/globals'
jest.unstable_mockModule("../../message.js", () => {
return {
__esModule: true,
send: jest.fn(() => Promise.resolve('mocked'))
}
})
const controller = (await import("../../handler.js")).default;