我对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,因此上述语法只是为对象实例创建共享功能的一种非常手动的方法。原型继承一​​开始可能会很混乱,我也花了一段时间才知道,但是您可以阅读herethis video也相当不错。

在测试中执行myModule.getCases时,实际上并没有修改实例(使用new创建)将继承的prototype属性。

现在看到getCases语法中的class和原型中的getCases是同一回事,希望您能看到替换后的结果解决了您的问题的原因。

如果我没有很清楚地解释任何事情,或者您想让我澄清任何问题,请随时提出。

关于javascript - 开玩笑:模拟类中的一个功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49438659/

10-09 14:56