【问题标题】:Jest: Mock one function in a class笑话:模拟一个类中的一个函数
【发布时间】:2018-03-22 21:19:09
【问题描述】:

我对 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.prototype.getCases 代替myModule.getCases。如果这是我将在答案中解释的解决方案。
  • 是的,行得通!如果您也提供答案,那就太好了:)

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


【解决方案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,因此上述语法只是为对象实例创建共享函数的一种非常手动的方法。原型继承一​​开始可能会很混乱,我也花了一段时间才弄明白,但你可以阅读它herethis video 也很好。

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

现在看到class 语法中的getCases 和原型上的getCases 是一回事,希望您能明白为什么替换可以解决您的问题。

如果我没有非常清楚地解释任何事情,或者您希望我澄清任何事情,请随时提问。

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-11
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多