我对node和javascript非常陌生,并尝试使用jest
编写unittet,在这里我只需要模拟类(和对象)的1个函数。
这是我正在使用的模板:
// myModule.js
class MyModule {
constructor() {
console.log("hello");
}
getCases(){
return 2;
}
getOtherCases(){
return 3;
}
}
module.exports = MyModule;
和测试:
// myModule.test.js
jest.unmock('./myModule.js');
const myModule = require('./myModule.js');
myModule.getCases = jest.fn();
describe('Test mock function', () => {
beforeAll(() => {
myModule.getCases.mockImplementation(() => 32);
mod = new myModule();
});
it('should pass', () => {
console.log(mod.getCases());
console.log(myModule.getCases());
});
});
这里的问题是
mod.getCases()
不模拟函数(myModule.getCases()
可以)console.log myModule.test.js:12
2
console.log myModule.test.js:13
32
我是否需要创建一种特定的方法来创建对象以便模拟功能?
最佳答案
您必须将所有MyModule.getCases
替换为MyModule.prototype.getCases
。
这是因为class
语法仅为syntactic sugar。没有这个,您将拥有(实际上我们曾经这样做)。
function MyModule () {
console.log('hello')
}
MyModule.prototype.getCases = function () {
return 2;
};
MyModule.prototype.getOtherCases = function () {
return 3;
};
module.exports = MyModule;
这完全等同于您的代码,如果您复制并粘贴了代码,您将看到它以相同的方式工作。
由于使用
new
创建的所有对象都继承了prototype
,因此上述语法只是为对象实例创建共享功能的一种非常手动的方法。原型继承一开始可能会很混乱,我也花了一段时间才知道,但是您可以阅读here,this video也相当不错。在测试中执行
myModule.getCases
时,实际上并没有修改实例(使用new
创建)将继承的prototype属性。现在看到
getCases
语法中的class
和原型中的getCases
是同一回事,希望您能看到替换后的结果解决了您的问题的原因。如果我没有很清楚地解释任何事情,或者您想让我澄清任何问题,请随时提出。
关于javascript - 开玩笑:模拟类中的一个功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49438659/