gpt4 book ai didi

javascript - 如何在 Jest 中增加模拟构造函数的实例

转载 作者:搜寻专家 更新时间:2023-11-01 04:35:03 24 4
gpt4 key购买 nike

我想增加而不是完全替换 Jest 中模拟构造函数的实例单元测试。

我想向实例添加一些值,但保留 Jest 的自动模拟优点。

例如:

A.js

module.exports = class A {
constructor(value) {
this.value = value;
}
getValue() {
return this.value;
}
}

要获得一些自动模拟功能:

jest.mock('./A');

使用 automock,实例有一个模拟的 .getValue()方法,但他们没有 .value属性(property)。

有记录的 way of mocking constructors是:

// SomeClass.js
module.exports = class SomeClass {
m(a, b) {}
}

// OtherModule.test.js
jest.mock('./SomeClass'); // this happens automatically with automocking
const SomeClass = require('./SomeClass')
const mMock = jest.fn()
SomeClass.mockImplementation(() => {
return {
m: mMock
}
})

const some = new SomeClass()
some.m('a', 'b')
console.log('Calls to m: ', mMock.mock.calls)

将该方法用于 A :

jest.mock('./A');

const A = require('./A');

A.mockImplementation((value) => {
return { value };
});

it('does stuff', () => {
const a = new A();
console.log(a); // -> A { value: 'value; }
});

这样做的好处是你可以对返回值做任何你想做的事情,比如初始化 .value .

缺点是:

  • 您不会免费获得任何自动驾驶,例如我需要添加 .getValue()我自己给实例
  • 你需要一个不同的jest.fn()创建的每个实例的模拟函数,例如如果我创建 A 的两个实例, 每个实例都需要自己的 jest.fn() .getValue() 的模拟函数方法
  • SomeClass.mock.instances未填充返回值 ( GitHub ticket )

有一点没用(我希望 Jest 能发挥一些魔力):

A.mockImplementation((value) => {
const rv = Object.create(A.prototype); // <- these are mocked methods
rv.value = value;
return rv;
});

不幸的是,所有实例都共享相同的方法(正如人们所期望的那样,但值得一试)。

我的下一步是通过检查原型(prototype)(我猜)自己生成模拟,但我想看看是否有既定的方法。

提前致谢。

最佳答案

事实证明这是固定的(从 jest 24.1.0 开始)并且问题中的代码按预期工作。


回顾一下,给定类 A:

A.js

module.exports = class A {
constructor(value) {
this.value = value;
}
setValue(value) {
this.value = value;
}
}

这个测试现在将通过:

A.test.js

jest.mock('./A');

const A = require('./A');

A.mockImplementation((value) => {
const rv = Object.create(A.prototype); // <- these are mocked methods
rv.value = value;
return rv;
});

it('does stuff', () => {
const a = new A('some-value');
expect(A.mock.instances.length).toBe(1);
expect(a instanceof A).toBe(true);
expect(a).toEqual({ value: 'some-value' });
a.setValue('another-value');
expect(a.setValue.mock.calls.length).toBe(1);
expect(a.setValue.mock.calls[0]).toEqual(['another-value']);
});

关于javascript - 如何在 Jest 中增加模拟构造函数的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47661741/

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