javascript - 使用 jest 监视未导出的 node.js 函数未按预期工作

标签 javascript node.js unit-testing jestjs

我正在尝试通过“jest”和“re-wire”模拟一个非导出函数。

我在这里尝试模拟“iAmBatman”(没有双关语意)但它没有导出。

所以我使用 rewire,效果很好。 但是 jest.mock 没有按预期工作。

我是否遗漏了一些东西,或者是否有一种简单的方法可以实现同样的目标?

jest给出的错误信息是:

无法侦测该属性,因为它不是函数;改为未定义

service.js

function iAmBatman() {
    return "Its not who I am underneath";
}

function makeACall() {
    service.someServiceCall(req => {
        iAmBatman();
    });
    return "response";
}

module.export = {
    makeACall : makeACall;
}

jest.js

const services = require('./service');
const rewire = require('rewire');
const app = rewire('./service');
const generateDeepVoice = app.__get__('iAmBatman'); 

const mockDeepVoice = jest.spyOn(services, generateDeepVoice);

mockDeepVoice.mockImplementation(_ => {
    return "But what I do that defines me";
});

describe(`....', () => {
    test('....', done => {
        services.makeACall(response, () => {

        });
    });
})

最佳答案

您的目标是什么并不完全清楚,但如果您查看 documentation of jest.spyOn ,您会看到它采用 methodName 作为第二个参数,而不是方法本身:

jest.spyOn(object, methodName)

这解释了您的错误:您没有给函数名称,而是给函数本身。 在这种情况下,使用 jest.spyOn(services, 'iAmBatman') 将不起作用,因为 iAmBatman 未导出,因此 services.iAmBatman未定义。

幸运的是,您不需要 spyOn,因为您可以简单地创建一个新的模拟函数,然后使用 rewire 的 __set__ 注入(inject)它,如下所示:

(请注意,我删除了您第一个文件中未定义的 service.someServiceCall,并修复了一些拼写错误和冗余导入)

// service.js

function iAmBatman() {
    return "Its not who I am underneath";
}

function makeACall() {
    return iAmBatman();
}

module.exports = {
    makeACall: makeACall
}
// service.test.js

const rewire = require('rewire');
const service = rewire('./service.js');

const mockDeepVoice = jest.fn(() => "But what I do that defines me")
service.__set__('iAmBatman', mockDeepVoice)

describe('service.js', () => {
    test('makeACall should call iAmBatman', () => {
        service.makeACall();
        expect(mockDeepVoice).toHaveBeenCalled();
    });
})

另一种选择是在单独的模块中使用 iAmBatman 重构您的代码,然后使用 Jest 模拟模块导入。参见 documentation of jest.mock.

关于javascript - 使用 jest 监视未导出的 node.js 函数未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56444408/

相关文章:

node.js - 无法安装 twitter bootstrap node.js 依赖项(在 Ubuntu 上)

unit-testing - 如何在单元测试中模拟 springSecurityService

vba - 使用 Rubberduck 单元测试,我如何找出多个断言中的哪一个失败?

.net - NUnit 中的 EqualTo() 和 EquivalentTo() 有什么区别?

javascript - 在 React 中柯里化(Currying)事件处理程序

javascript - nowjs - 拒绝客户端连接

javascript - jQuery 选择 JavaScript 生成的元素

javascript - 在 socket.io 中使用 jQuery

javascript - 如何动态更改此随机数生成器的曲线?

JavaScript:自调用函数返回一个闭包。它是做什么用的?