Jest:在类

时间:2018-03-22 21:19:10

标签: javascript node.js unit-testing mocking jestjs

我对节点和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

我是否需要一种特定的方法来创建对象,以便模拟函数?

1 个答案:

答案 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是一样的,希望您能看到替换解决问题的原因。

如果我没有清楚地解释任何事情,或者你希望我澄清任何可以随意提出的问题。