【问题标题】:Best practice for mocking module exports in Typescript & NodeJS在 Typescript 和 NodeJS 中模拟模块导出的最佳实践
【发布时间】:2017-12-02 20:42:21
【问题描述】:

我们有一个 NodeJS 应用程序编写的 Typescript。 我们使用模块来导出几个函数,而不是对象。

一旦我们想在测试期间模拟这些函数,我们就使用mock-require

但是,代码变得非常难看。因为我们基本上需要

  1. 导入mock-require
  2. 构建我们的模拟和间谍
  3. import {functionA,FunctionB} from "module-to-test"
  4. mock.reRequire("module-to-test")

代码看起来像这样:

// mocking require imports
import * as mock from "mock-require";
import {getMockUserObject} from "../../test/utils/mock-objects";

const user = getMockUserObject();
let userModelSpy;

// mock userModel
userModelSpy = jasmine.createSpyObj("userModelSpy", ["findOne"]);
userModelSpy.findOne.and.returnValue(Promise.resolve(user));
mock("../data-source/mongo-data-source", {userModel: userModelSpy});    

// actual import statements
import {functionA,FunctionB} from "module-to-test";

// reRequire the module that we want to test
mock.reRequire("./mail.service");

有什么办法可以让它不那么难看吗?例如。保持进口在一起。 如果我们将模拟移动到 beforeEach 中,或者通常在实际要测试的模块的导入下,reRequire 不起作用,或者至少我们的模拟不会被调用。所以要测试的模块使用实际的依赖项而不是模拟的依赖项。

感谢您的意见!

【问题讨论】:

    标签: node.js unit-testing typescript node-modules


    【解决方案1】:

    使用 ES6 模块进行模拟可能会很痛苦,TypeScript 也有同样的问题。我采用了一种不同的方法:我没有模拟实际的导入,而是使用构造函数注入。这样,任何模拟都可以注入到测试单元中。

    这是一个例子:

    import {someDependency} from "./someDependency";
    
    export class Unit {
        private someDependency;
        constructor(someDependency) {
            this.someDependency = someDependency;
        }
    }
    

    还有单元测试:

    import {Unit} from "./Unit";
    
    const mock: any = () => {};
    const unit = new Unit(mock);
    

    这样我就不需要在单元测试中导入依赖项了。

    还有其他方法,但到目前为止,我发现这是最干净的。

    注意:使用 any 注释模拟告诉 TypeScript 允许它们在构造函数中,尽管类型不匹配。

    【讨论】:

    • 嗨,各位。我从角度知道这种方法。但是如果一个人不想使用类,因为它只是一堆函数(例如 Express 中的路由器)。我想既然在幕后,类也只是函数,应该有办法做到这一点。
    • 我不知道答案。就个人而言,我集成测试控制器而不是单元测试它们。
    • ts-mock-imports 是我创建的一个库,可让您轻松模拟类导入。它还与 Typescript 配合得很好,因此您的类型得到维护。
    猜你喜欢
    • 2016-10-05
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2015-02-15
    相关资源
    最近更新 更多