Node.js   发布时间:2022-04-24  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Typescript / Node.js – 如何模拟传递依赖关系进行集成测试?大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
假设我有一条由控制器处理的Express路线.控制器使用服务,服务使用存储库与数据源通信.

我想使用Supertest创建@L_674_2@集成测试来测试该路由:

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

我的问题是我需要模拟存储库/数据源,来运行测试!我想硬编码一些值,好像它们来自真实的数据源.我有什么选择?

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

我想使用普通的Javascript我可以使用Proxyquire及其@L_197_4@功能,从测试本身模拟存储库.但我不确定这适用于Typescript.

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

解决方法

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

虑以下代码

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

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

@H_450_9@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'); }); });

因此,基本上对于集成测试,您可以在启动应用程序之前导入和存根依赖项.我这样做了@L_674_2@app.proxy.ts文件

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

大佬总结

以上是大佬教程为你收集整理的Typescript / Node.js – 如何模拟传递依赖关系进行集成测试?全部内容,希望文章能够帮你解决Typescript / Node.js – 如何模拟传递依赖关系进行集成测试?所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。