假设我有以下课程:
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”已成功模拟。但是,第二个“期望”失败并出现错误:
类型错误:person.bla 不是函数
我知道模拟类删除了所有方法。
我想知道如何模拟一个类,以便仅模拟特定的方法。
Using 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');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)