开玩笑嘲笑要测试的类要使用的ES6类

时间:2019-08-27 22:28:18

标签: javascript unit-testing jestjs

我试图开玩笑地创建一个模拟的js类,该类用于将数据获取/放入测试期间不可用的服务器。因此,我一直在尝试创建一个模拟类,该类将在调用时传递数据,以下是这些类

data-service-controller.js

class DataServiceController {
  constructor() {
    this._model = DataServiceModel;
  }

  getUser(id){
    return $.get('some-url');
  }

}

export default new DataServiceController();

user-controller.js

import DataServiceController from '...';

class UserController {
  constructor() {
    this.userId = '';
  }

  checkUserPermissions(id) {
    DataServiceController.getUser(id).then((resp) => { ... });
  }
}
export default new UserController();

user-controller.test.js

import UserController from "./user-controller.js";

describe("A utility class for user", () => {
    describe("check permissions", () => {
        it("should check the users permissions", () => {
            ...
        });
    });
});

我正在尝试模拟DataServiceController,但是遇到问题,并且没有找到如何模拟名称空间的好示例,以便UserController将使用模拟的DataServiceController,并且我可以使用模拟传递值

1 个答案:

答案 0 :(得分:1)

查看有关开玩笑的文档的ES6 Class Mocks。很多好的信息和示例,您可能只需使用自动模拟就可以完成,而不必定义手动模拟。另外,请注意Mocking Modules,因为您要导出单例实例而不是类。

悬挂了模拟集,因此您可以在测试中模拟依赖项,而不必担心将其放在导入之前。

示例:

import UserController from "./user-controller.js";
import DataServiceController from './path/to/DataServiceController';

jest.mock('./path/to/DataServiceController');

describe("A utility class for user", () => {
    describe("check permissions", () => {
        it("should check the users permissions", () => {
           DataServiceController.getUser.mockResolvedValue({...});
           return UserController.checkUserPermissions(123).then(() => {
             //Make assertions that your mock resolved value is being used
           });
        });
    });
});

这是一个有关how mocks work.的有用的存储库,用于解决吊装问题。