Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 角度服务测试:找不到名称';异步数据';_Angular_Testing - Fatal编程技术网

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

因此,我正在学习如何在Angular中测试服务,并尝试在Angular文档中复制下面的示例

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()