Angular 角度服务测试:找不到名称';异步数据';
因此,我正在学习如何在Angular中测试服务,并尝试在Angular文档中复制下面的示例Angular 角度服务测试:找不到名称';异步数据';,angular,testing,Angular,Testing,因此,我正在学习如何在Angular中测试服务,并尝试在Angular文档中复制下面的示例 let httpClientSpy: { get: jasmine.Spy }; let heroService: HeroService; beforeEach(() => { // TODO: spy on other methods too httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']); heroServi
let httpClientSpy: { get: jasmine.Spy };
let heroService: HeroService;
beforeEach(() => {
// TODO: spy on other methods too
httpClientSpy = jasmine.createSpyObj('HttpClient', ['get']);
heroService = new HeroService(<any> httpClientSpy);
});
it('should return expected heroes (HttpClient called once)', () => {
const expectedHeroes: Hero[] =
[{ id: 1, name: 'A' }, { id: 2, name: 'B' }];
httpClientSpy.get.and.returnValue(asyncData(expectedHeroes));
heroService.getHeroes().subscribe(
heroes => expect(heroes).toEqual(expectedHeroes, 'expected heroes'),
fail
);
expect(httpClientSpy.get.calls.count()).toBe(1, 'one call');
});
更改此行:
httpClientSpy.get.and.returnValue(asyncData(expectedHeroes));
使用()的可观察运算符of
这将返回一个可订阅的可观察对象,并返回expectedHeroes。如果您使用的是Angular 6,则可以直接从rxjs导入:
import {of} from 'rxjs';
如果从angular文档下载示例代码,您将在testing>async-observable-helpers.ts文件中找到“asyncData”定义 我引述: async observable由
asyncData
helper生成。asyncData
helper是一个实用函数,您必须自己编写。或者,您可以从示例代码中复制此代码:
测试/异步可观察助手。ts
/** Create async observable that emits-once and completes
* after a JS engine turn */
export function asyncData<T>(data: T) {
return defer(() => Promise.resolve(data));
}
/**创建一次发射并完成的异步可观测对象
*在JS引擎转动之后*/
导出函数异步数据(数据:T){
返回延迟(()=>Promise.resolve(数据));
}
注:defer
来自rxjs
,即:import{defer}来自“rxjs”代码>请参见
但是,在默认情况下,使用()的of
同步是很好的。只需使用
的即可获得以下订单:
- 期望1
- 水龙头
- 潜艇
- 定稿
- 期望2
expect1()
of('hello').pipe(finalize(..),tap(..)).subscribe(..)
expect2()
如果改为异步,我认为您将获得以下订单:
- 期望1
- 期望2
- 水龙头
- 潜艇
- 定稿
当我设计一个服务方法时,我通常让它返回一个observable,即使组件不需要来自服务的任何数据,我也可以使用(map(()=>null))返回observable。如果我需要测试该链中的代码,我可能会创建一个助手方法,该方法可以被测试调用。阅读教程文档,他们声称
您可以使用此spy编写许多有用的测试,尽管它的可观察性是同步的。
他们后来在这个asyncData
函数中包含了一个使用defer
来实现更异步的简介,所以即使它工作得很好,这也可能不完全相同。我想知道Angolar.io为什么不将其文章从asyncData改为Of???为了解决这个问题,我花了好几个小时来检查我的代码:|谢谢,伙计。这个方法本身被证明是错误的*以下方法不起作用*使用of().delay()
触发测试床错误;*见*使用asap
调度程序(如(value,asap)的也不起作用。这是链接
import {of} from 'rxjs';
/** Create async observable that emits-once and completes
* after a JS engine turn */
export function asyncData<T>(data: T) {
return defer(() => Promise.resolve(data));
}
Rx.Observable.of(1, 2, 3, Rx.Scheduler.async).subscribe(
(val) => console.log(val)
);
console.log('first');
This will log out:
//first
//1
//2
//3
expect1()
of('hello').pipe(finalize(..),tap(..)).subscribe(..)
expect2()