gpt4 book ai didi

javascript - 开 Jest : How to mock one specific method of a class

转载 作者:行者123 更新时间:2023-12-03 13:38:54 25 4
gpt4 key购买 nike

假设我有以下类(class):

export default class Person {
constructor(first, last) {
this.first = first;
this.last = last;
}
sayMyName() {
console.log(this.first + " " + this.last);
}
bla() {
return "bla";
}
}

假设我想创建一个模拟类,其中方法“sayMyName”将被模拟,而方法“bla”将保持原样。

我写的测试是:
const Person = require("../Person");

jest.mock('../Person', () => {
return jest.fn().mockImplementation(() => {
return {sayMyName: () => {
return 'Hello'
}};
});
});


let person = new Person();
test('MyTest', () => {
expect(person.sayMyName()).toBe("Hello");
expect(person.bla()).toBe("bla");
})

第一个 'expect' 语句通过,这意味着 'sayMyName' 被成功模拟。但是,第二个“期望”失败并出现错误:

TypeError: person.bla is not a function



我知道模拟类删除了所有方法。
我想知道如何模拟一个类,以便只模拟特定的方法。

最佳答案

使用 jest.spyOn() 是模拟单个方法并保留其余方法的正确 Jest 方式。实际上有两种略有不同的方法。

1.只在单个对象中修改方法

import Person from "./Person";

test('Modify only instance', () => {
let person = new Person('Lorem', 'Ipsum');
let spy = jest.spyOn(person, 'sayMyName').mockImplementation(() => 'Hello');

expect(person.sayMyName()).toBe("Hello");
expect(person.bla()).toBe("bla");

// unnecessary in this case, putting it here just to illustrate how to "unmock" a method
spy.mockRestore();
});

2.修改类本身,让所有的实例都受到影响

import Person from "./Person";

beforeAll(() => {
jest.spyOn(Person.prototype, 'sayMyName').mockImplementation(() => 'Hello');
});

afterAll(() => {
jest.restoreAllMocks();
});

test('Modify class', () => {
let person = new Person('Lorem', 'Ipsum');
expect(person.sayMyName()).toBe("Hello");
expect(person.bla()).toBe("bla");
});

为了完整起见,这就是模拟静态方法的方式:

jest.spyOn(Person, 'myStaticMethod').mockImplementation(() => 'blah');

关于javascript - 开 Jest : How to mock one specific method of a class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50091438/

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