单元测试 – 测试可观察对象角度2业力
我正在使用Karma处理Angular 2的单元测试用例,我遇到了一个函数,我在下面运行测试
expect(component.subscribeToEvents()).toBeTruthy(); 我查看我的覆盖代码,测试文件中的行似乎没有覆盖订阅内的任何内容.我曾尝试使用MockBackend模拟服务函数内的api调用,但我不确定如何对订阅对象进行模拟,有人可以帮助我吗? 以下是test.component.ts subscribeToEvents() { this.subscription = this.czData.$selectedColorZone .subscribe(items => { this.resourceLoading = true; if (!this.resourceData || (this.resourceData && this.resourceData.length === 0)) { this.settings.layout.flypanel.display = false; this.getAllResources(this.pagination.start,this.pagination.size); } else { this.pagination.start = 1; this.pagination.end = this.pagination.size; this.getAllResources(1,this.pagination.size); this.settings.layout.flypanel.display = true; } }); return true; } 覆盖代码的屏幕截图
您无法执行此操作,因为订阅是异步解析的.因此,在解析异步任务之前完成同步测试.
如果你想要的只是覆盖,你可以让测试异步.这将导致Angular测试区在完成测试之前等待异步任务得到解决 import { async } from '@angular/core/testing'; it('..',async(() => { component.subscribeToEvents(); })) 你不能试图在这里期待任何东西,因为在任务解决时没有回调钩子.所以这真是一个毫无意义的考验.它会给你报道,但你实际上并没有测试任何东西.例如,您可能希望测试在解析订阅时设置变量. 根据提供的代码,我要做的只是模拟服务,并使其同步.你怎么能这样做?我们你可以做模拟的东西 class CzDataSub { items: any = []; $selectedColorZone = { subscribe: (callback: Function) => { callback(this.items); } } } 然后在测试中配置它 let czData: CzDataStub; beforeEach(() => { czData = new CzDataStub(); TestBed.configureTestingModule({ providers: [ { provide: CzData,useValue: czData } ] }) }) 现在在您的测试中,您不需要将其设置为异步,并且您可以通过在模拟上设置items属性来提供您想要的任何值,并且订阅者将获得它 it('..',() => { czData.items = something; component.subscribeToEvents(); expect(component.settings.layout.flypanel.display).toBe(false); }) UPDATE 当我写这篇文章时,我想我半睡半醒.上述陈述之一是不正确的
这不完全正确.这就是fixture.whenStable()的用途.例如,如果这是您的服务 class CzData { _value = new Subject<>(); $selectedColorZone = this._value.asObservable(); setValue(value) { this._value.next(value); } } 那么这就是你如何使测试工作 let czData: CzData; let fixture: ComponentFixture<YourComponent>; let component: YourComponent; beforeEach(() => { TestBed.configureTestingModule({ providers: [ CzData ],declarations: [ YourComponent ] }); fixture = TestBed.createComponent(YourComponent); component = fixture.componentInstance; czData = TestBed.get(czData); }) it('..',async(() => { component.subscribeToEvents(); czData.setValue(somevalue); fixture.whenStable().then(() => { expect(component.settings.layout.flypanel.display).toBe(false); }) })) 我们使用fixture.whenStable()来等待异步任务完成. 这并不是说使用模拟是错误的.很多时候,使用模拟将是要走的路.我只想纠正我的陈述,并说明如何做到这一点. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何使用angularJs检查用户是否有互联网连接
- AngularJS 如何从控制器组件外部调用控制器功能
- 关于央视国际(CCTV.COM)的奥运门户网站的预警
- typescript – Angular2 rc1,新路由器和传递数据
- 工作总结之-----WebService计时器如何叫醒
- 当winheight选项未设置两次时为什么不能vim处理.vimrc?
- bash – Docker exec / run shell命令嵌套
- Play Framework 2(Scala)模板:查看用户是否已登录
- 【数据结构】第9章 查找! (二叉搜索树BST AVL树 B-(+)树 字
- 使用docker监控器登录到stdout
- Angular2错误:没有指令,“exportAs”设置为“ng
- angularjs – angular ui-bootstrap datepicker
- 在OpenLDAP中重命名基本DN
- 将Angular js API与ASP.net webForms一起使用
- Docker RUN vs CMD vs ENTRYPOINT
- angularjs – 使用$compileProvider.debugInfoEn
- postfix – dovecot错误未知设置:unix_listener
- 20.5 Shell脚本中的逻辑判断;20.6 文件目录属性
- 专家观察 | 魏新宇:“金融行业自动化运维的研究
- 【数据结构】静态查找之二分查找