Jest:我应该如何模拟一个类函数?

时间:2017-06-08 02:36:17

标签: javascript unit-testing mocking jestjs

晚上好!

我试图全面了解嘲笑,这似乎是一个很好的例子。

我有一个来处理图像加载并使用别名(例如this._imgLoaded[path] = image)跟踪所述图像

export default class Loader {

    // Constructor and what not

    _loadImage(path) {
        return new Promise((resolve, reject) => {
          let image = new Image();
          image.src = path;
          image.onload = () => resolve(image);
          image.onerror = () =>
            reject(new Error("Image is not defined. Unable to load it."));
        });
      }

      async loadImage(path, alias) {
        const newPath = this._enrichRelativePath(path);
        let image;
        try {
          image = await this._loadImage(newPath);
        } catch (error) {
          // log and rethrow
          console.error(error);
          throw error;
        }

        // cache the loaded image:
        this._imgLoaded[newPath] = image;

        if (alias) {
          this._imgAlias[alias] = newPath;
        }
      }
    }

我认为为了对此进行单元测试,我必须为_loadImage创建一个模拟函数并使其返回一些东西。

最好的方法是什么,而保持其他功能完整

作为旁注,我使用的是ES6。

谢谢!

1 个答案:

答案 0 :(得分:2)

它似乎适用于原型( __ mocks __ / loader.js ):

let Loader = require.requireActual("../src/loader.js");

Loader.prototype._loadImage = function() {
  return "test";
};

module.exports = Loader;

然后,在测试文件中( __ tests __ / loader.test.js ):

import Loader from "loader";
jest.setMock("loader", require("../__mocks__/loader"));

test("Something", () => {
  expect.assertions(1);

  const loader = new Loader();

  expect(loader._loadImage()).toBe("test");
});