node.js - Typescript/Node.js - 如何模拟集成测试的传递依赖?

标签 node.js typescript supertest proxyquire

假设我有一条由 Controller 处理的 Express 路线。 Controller 使用服务,服务使用存储库与数据源对话。

我想使用 Supertest 创建一个集成测试测试这条路线:

test -> my Express app -> controller -> service -> repository -> data source

我的问题是我需要mock 存储库/数据源来运行测试!我想对一些值进行硬编码,就好像它们来自真实数据源一样。我有哪些选择?

在 Java 世界中,我会使用 Spring 或 Guice 的依赖注入(inject),并且我会用这种方式用模拟版本替换存储库。在 Typescript/Node.js 世界中实现这种模拟的模式是什么?

我想如果使用纯 Javascript 我可以使用 Proxyquire 及其 Globally override require功能,从测试本身模拟存储库。但我不确定这是否适用于 Typescript。

那么,使用 Typescript 和 Node.js 从测试文件中模拟“深层”组件(传递依赖)的推荐方法是什么?

最佳答案

模块在第一次加载后被缓存,因此您可以先将它们加载到您的测试文件中,然后使用像 sinon 这样的库将它们 stub 。

考虑以下代码:

// dependency.ts
export function foo(){
    return 'foo';
}

// app.ts
import {foo} from './dependency';
export default function main(){
    return  'winner ' + foo();
}

您可以通过以下方式测试 app.ts 与 sinon 的依赖关系:

import * as Dependency from '../src/dependency';
import main from '../src/app';

describe('test dependency', () => {
    var fooStub;
    beforeEach(() => {
        fooStub = sinon.stub(Dependency, 'foo');
        fooStub.returns('la la lang');
    });
    afterEach(()=>{
        fooStub.restore();
    })

    it('uses stubbed dependency', ()=>{
        expect(main()).to.be.equal('winner la la lang');
    });

    it('can return different values on other tests', ()=>{
        fooStub.returns('moonlight');
        expect(main()).to.be.equal('winner moonlight');
    });
});

所以基本上对于您的集成测试,您可以在启动应用程序之前导入和 stub 您的依赖项。我已经创建了一个 app.proxy.ts 文件:

  • app.proxy 中导入您的存储库并将其 stub 以返回预定义的数据。设置 stub 后,导入真正的app.ts并导出。
  • 在您的集成测试文件中,导入 app.proxy 而不是 app 并将其与 supertest 一起使用。这最终会给你应用程序,但是在设置 stub 依赖之后!
  • 编写并运行测试,知道它将使用预定义的数据

关于node.js - Typescript/Node.js - 如何模拟集成测试的传递依赖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42497368/

相关文章:

javascript - 测试后关闭服务器和数据库连接

node.js - 如何使用 superagent/supertest 链接 http 调用?

javascript - 无法在 Nodejs 中执行文件上传程序

angular - Angular 2 Bootstrap 日期选择器的输入未设置值

typescript - 在 TypeScript 中通过装饰器向类添加属性

jquery - 单选按钮值返回未定义

node.js - 使用 mocha/supertest 测试随机值

Node.js morgan 记录器输出未出现在控制台上

javascript - node.js 从 View 中查询 mysql 数据库可能吗?

node.js - NodeJS 带有 byId() 的额外字段;