我目前正在尝试测试对另一个服务具有异步依赖性的服务(而不是组件).我不是100%确定测试中的哪一点检查异步调用的结果是有效的.你能在服务的异步处理程序中调用expect()吗?
service.foo() .then((data) => { //do I check the results in here? expect(data).toEqual({ a: 1,b: 2 }); expect(mockDep.get).toHaveBeenCalled(); });
这是完整的测试.
import { Testbed,inject } from '@angular/core/testing'; import { MyService } from './my.service.ts'; import { MyDependency } from './dependency.service.ts'; class MockDependency { doSomething(): Promise<any> { throw Error('not implemented'); }; } describe('some tests',() => { beforeEach(() => { Testbed.configureTestingModule({ providers: [ MyService,{ provide: MyDependency,useClass: MockDependency } ] }); }); }); it('should do something',inject([MyService,MyDependency],(service: MyService,mockDep: MyDependency) => { spyOn(mockDep,'doSomething').and.callFake(function () { return Promise.resolve({ a: 1,b: 2 }); }); service.foo() .then((data) => { //do I check the results in here? expect(data).toEqual({ a: 1,b: 2 }); expect(mockDep.get).toHaveBeenCalled(); }); }));
解决方法
首先,您必须确保如果异步检索结果,则在尝试测试结果之前等待结果可用.
因此,如果异步结果是一个承诺,例如,您可以将您的期望放在当时的处理程序中,就像您在问题中指出的那样.
您必须关注的第二个问题是强制您的测试本身在给出积极(或消极)结果之前等待您的期望执行.如果你不处理这个问题,你可能会遇到期望失败的情况,但是因为你的测试没有等到你的异步操作在完成之前完成,所以测试会报告误报.
有几种方法可以“让你的测试等待”.
纯粹的茉莉花方式是将一个完成的处理程序传递给你的it函数.然后jasmine将等待,直到调用完成处理程序,然后才考虑完成测试.
例如.
it('tests an async action',(done) => { asyncAction().then(result => { expect(result).toEqual(true); done(); }); });
但是,angular的测试框架为此添加了两个其他选项.如果您对异步编程感到满意,那么第一个更容易掌握.
it('tests an async action',async(() => { asyncAction().then(result => { expect(result).toEqual(true); }); }));
在这种情况下,您基本上将测试处理程序包装在异步函数中.在允许测试完成之前,此函数将强制测试等待任何异步结果(例如promises,observables等)返回结果.
第二种方法是使用fakeAsync,它允许您完全隐藏测试的异步性质.
it('tests an async action',fakeAsync(() => { let myResult; asyncAction().then(result => { myResult = result; }); tick(); <--- force all async actions to complete expect(myResult).toEqual(true); }));
fakeAsync挂钩到所有异步函数,并允许您将它们视为同步.您可以使用tick()函数“强制您的测试等待”,以便在继续之前完成异步任务.
(这不是那么做,但从概念上讲,你可以这样想).
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。