开玩笑模拟“TypeError:无法分配给只读属性”

问题描述 投票:0回答:1

我正在使用笑话

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

javascript node.js unit-testing jestjs
1个回答
0
投票

我找到了解决方案。

以下测试代码有效

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;
© www.soinside.com 2019 - 2024. All rights reserved.