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