我对节点和javascript非常陌生,并尝试用jest
编写一个单元格,我只需要模拟一个类(和对象)的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
我是否需要一种特定的方法来创建对象,以便模拟函数?
答案 0 :(得分:1)
您必须将所有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
是一样的,希望您能看到替换解决问题的原因。
如果我没有清楚地解释任何事情,或者你希望我澄清任何可以随意提出的问题。