У меня есть приложение с угловым 2, которое работает нормально до сих пор. My GlobalsService.getGlobals() извлекает «Штаты США» через мой OptionService.getOptions(). Там, где мой код падает, в тестировании Karma/Jasmine.Angular2 Karma test говорит: «TypeError: this._subscribe не является функцией»
Когда я вызываю getGlobals() в моей текущей тестовой настройке, я получаю ошибку «this._subscribe is not a function». Мне сложно отлаживать это, потому что Google Chrome не сотрудничает.
Мой код 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 это «GlobalsService».
Мой издевались код OptionService является:
@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);
}
}
Это впрыскивается через:
describe('Globals Service',() => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: OptionService, useClass: MockOptionService },
{ provide: GlobalsService, useClass: GlobalsService }
]
});
[SNIP]
});
Как я уже сказал, у меня возникают проблемы с Chrome при отладке этого. Если я покажу источник Observable.js в отладчике и попытаюсь установить точку останова, браузер отобразит пустую страницу для несуществующего файла Observable.ts. Точка останова не отображается ни в одном месте. Код останавливается на несуществующем Observable.ts: 92.
Мои вопросы, то:
1. Могу ли я убедить Chrome, чтобы дать мне точку останова Javascript в машинописном мире?
2. Какова надлежащая функция для создания массива объектов и присоединения его к наблюдаемому? Я подозреваю, что Observable.create() ошибочен.
Thanks, Jerome.
Я пробовал это и получаю результаты. Я все еще беспокоюсь о антисоциальном поведении Chrome. –