Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/28.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
Angular2业力测试说;TypeError:这是“订阅不是函数”;_Angular_Karma Jasmine_Observable - Fatal编程技术网

Angular2业力测试说;TypeError:这是“订阅不是函数”;

Angular2业力测试说;TypeError:这是“订阅不是函数”;,angular,karma-jasmine,observable,Angular,Karma Jasmine,Observable,到目前为止,我有一个Angular 2应用程序运行正常。My GlobalService.getGlobals()通过我的OptionService.getOptions()获取“美国各州”。我的代码在Karma/Jasmine测试中失败了 当我在当前测试设置中调用getGlobals()时,会出现“this.\u subscribe is not a function”错误。我发现这很难调试,因为谷歌浏览器不配合 添加调试的My getGlobals()代码。我将代码拆分为getOptions

到目前为止,我有一个Angular 2应用程序运行正常。My GlobalService.getGlobals()通过我的OptionService.getOptions()获取“美国各州”。我的代码在Karma/Jasmine测试中失败了

当我在当前测试设置中调用getGlobals()时,会出现“this.\u subscribe is not a function”错误。我发现这很难调试,因为谷歌浏览器不配合

添加调试的My getGlobals()代码。我将代码拆分为getOptions()和.subscribe(),以查看发生了什么

public getGlobals(): void {
  let asdf = this.optionService.getOptions();

  console.log("asdf is " + (typeof asdf) + ", asdf.subscribe is: " + asdf.subscribe);
  try {
    asdf.subscribe(
      (options: Option[]) => this.fillOptions(options),
      (error: string) => this.error = error
    );
  } catch(error) {
    console.log("caught error involving asdf, it is: " + error);
    throw error;
  }
}
当我运行此代码时,我得到:

 LOG: 'asdf is object, asdf.subscribe is: function (observerOrNext, error, complete) {
[1]         var operator = this.operator;
[1]         var sink = toSubscriber_1.toSubscriber(observerOrNext, error, complete);
[1]         if (operator) {
[1]             operator.call(sink, this.source);
[1]         }
[1]         else {
[1]             sink.add(this._subscribe(sink));
[1]         }
[1]         if (sink.syncErrorThrowable) {
[1]             sink.syncErrorThrowable = false;
[1]             if (sink.syncErrorThrown) {
[1]                 throw sink.syncErrorValue;
[1]             }
[1]         }
[1]         return sink;
[1]     }'
asdf.subscribe的代码是您在node_modules/rxjs/Observable.js中看到的。因此,getOptions()的返回是可观察的。在其众多属性中,它具有以下特征:

_subscribe: Array[4] (each item is an Object of my Option data type)
_proto_: Object
  _subscribe: (subscriber) 
  subscribe: (observer or next, error, complete)
但是如果我让代码继续,我会得到错误。带有asdf变量“this”的地方是GlobalService

我的模拟选项服务代码是:

@Injectable()
export class MockOptionService {
  constructor() { }

  getOptions(): Observable<Option[]> {
    let options: Option[] = [
      { id: 'IN', name: 'Indiana', topic: Option.TOPIC_STATE },
      { id: 'NJ', name: 'New Jersey', topic: Option.TOPIC_STATE },
      { id: 'CONCERT', name: "Concert", topic: Option.TOPIC_EVENT_TYPE },
      { id: 'NY', name: 'New York', topic: Option.TOPIC_STATE }
    ];
    return Observable.create(options);
  }

}
}))

正如我所说,我在调试Chrome时遇到了问题。如果我在调试器中显示Observable.js源代码并尝试设置断点,浏览器将为不存在的Observable.ts文件显示一个空白页面。断点在两个位置都不显示。代码在不存在的可观察对象上停止。ts:92

那么,我的问题是:

1。我能说服Chrome在Typescript世界中给我一个Javascript断点吗?

2。创建对象数组并将其附加到可观察对象上的正确功能是什么?我怀疑Observable.create()是错误的。

谢谢,
杰罗姆。

改用。需要一个订阅函数
Observable.create
用于创建一个“自定义逻辑”
Observable
,而
Observable.of
只创建一个基本的
Observable
,它会发出你传递给它的值。

我已经尝试过并得到了结果。我仍然对Chrome的反社会行为感到疑惑。
describe('Globals Service', () => {

  beforeEach(() => {

    TestBed.configureTestingModule({
      providers: [
        { provide: OptionService, useClass: MockOptionService },
        { provide: GlobalsService, useClass: GlobalsService }
      ]
    });
[SNIP]