gpt4 book ai didi

javascript - 如何在类中用 Jest 模拟节点模块?

转载 作者:行者123 更新时间:2023-12-02 23:01:39 26 4
gpt4 key购买 nike

我需要在类中模拟 DNS 节点模块,但我不确定如何执行此操作,因为它包含在类中。这是该类的示例...

import { lookup } from 'dns';

class Foo {
// ...
protected async _bar(IP: string) {
// I want to mock "lookup"
await new Promise<undefined>((resolve, reject) => {
lookup(IP, (err, addr) => {
if (err) reject(new Error('DNS Lookup failed for IP_ADDR ' + IP));

resolve();
});
});

// If dns found then return true
return true;
}
// ...
}

我想创建一个测试文件foo.spec.ts,其中包含类似于以下内容的测试:

import { Foo } from './Foo';

describe('Foo', () => {
it('Bar Method returns true on success', () => {
const test = new Foo();

expect(test._bar('192.168.1.1')).resolves.toBeTruthy();
});
});

鉴于类定义位于与测试本身不同的单独文件中,我不确定如何在类 Foo 中模拟 lookup 调用。

如有任何帮助,我们将不胜感激!

最佳答案

您使用lookup的方式将不起作用,因为它不返回Promise...

...但您可以使用 util.promisify 将其转换为返回 Promise 的版本.

代码最终看起来像这样:

import { lookup as originalLookup } from 'dns';  // <= import original lookup...
import { promisify } from 'util';
const lookup = promisify(originalLookup); // <= ...and promisify it

export class Foo {
async _bar(IP: string) {
await lookup(IP).catch(err => { throw new Error('Failed'); });
return true;
}
}

然后,您可以使用 jest.mock 在测试中模拟 lookup,如下所示:

import { Foo } from './Foo';

jest.mock('dns', () => ({
lookup: (hostname, callback) => {
hostname === 'example.com' ? callback() : callback('error');
}
}))

describe('Foo', () => {
it('Bar Method returns true on success', async () => {
const test = new Foo();
await expect(test._bar('example.com')).resolves.toBeTruthy(); // Success!
await expect(test._bar('something else')).rejects.toThrowError('Failed'); // Success!
});
});

请注意,由于调用 jest.mock,因此需要使用 jest.mock (而不是类似 jest.spyOn 的东西)创建模拟> 被吊起并先跑。模拟需要在导入 Foo.js 之前就位,因为它所做的第一件事是创建并存储 promise 的 lookup

关于javascript - 如何在类中用 Jest 模拟节点模块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57757898/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com