2017-02-08 3 views
2

У меня есть приложение с угловым 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.

ответ

5

Использовать вместо Observable.of. Observable.create ожидает функцию подписки. Observable.create предназначен для создания «пользовательской логики» Observable, а Observable.of просто создает базовый Observable, который испускает значение, которое вы передаете ему.

+0

Я пробовал это и получаю результаты. Я все еще беспокоюсь о антисоциальном поведении Chrome. –

Смежные вопросы