Проверка AngularFire на предмет существования объекта с использованием Rx JS Тема - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь проверить наличие объекта в моей таблице AngularFire. У меня проблемы с возвратом субъекта, чтобы определить, существует ли файл.

/**
 * Check if the Id exists in storage
 * @param Id string | number Key value to check
 * @returns Subject<boolean>
 */
public Exists(Id:string):Subject<boolean> {
    const Status$:Subject<boolean> = new Subject<boolean>();

    let RecordExists:boolean = false;
    this.AfDb_.object<T>(`_Testing_/${Id}`).valueChanges()
        .subscribe( (OneRecord:T) => {
            if (OneRecord.Key_ !== undefined && OneRecord.Key_ !== null && OneRecord.Key_.length > 0) {
                RecordExists = true;
            }
        })
    ;
    Status$.next(RecordExists);
    return Status$;
}

Это всегда возвращает неопределенное значение. Мои автоматические тесты также не пройдут.

it('should confirm a record exists in storage', fakeAsync( () => {
    let Exists:boolean;
    const Status$:Subject<boolean> = ServiceUnderTest.Exists('Good');    // This exists in Firebase
    Status$.subscribe( (Result:boolean) => {
        Exists = Result;
    });
    flushMicrotasks();
    Status$.unsubscribe();
    expect(Exists).toBeTrue();
}));

У меня есть доступ в Firebase к / Testing / Good, который является объектом со структурой Key_ и Name.

Модули из пакета. json

"@angular/fire": "^5.4.2",
"firebase": "^7.9.3",

Однако, если я просто попытаюсь вернуть результат, не обращаясь непосредственно к AngularFire, эти тесты сработают.

public Exists(Id:string):BehaviorSubject<boolean> {
    const Status:BehaviorSubject<boolean | undefined> = new BehaviorSubject<boolean | undefined>(undefined);

    Status.next(true);
    return Status;
}

1 Ответ

1 голос
/ 09 марта 2020

Вы должны позвонить next по теме, когда RecordExists пришел от .valueChanges(), например:

    let RecordExists:boolean = false;
    this.AfDb_.object<T>(`_Testing_/${Id}`).valueChanges()
        .subscribe( (OneRecord:T) => {


            if (OneRecord.Key_ !== undefined && OneRecord.Key_ !== null && OneRecord.Key_.length > 0) {
                Status$.next(true);
            } else {
                 Status$.next(false);
           }
        })
    ;
    return Status$;

Ваш код ведет себя по-разному в тесте и простом примере, потому что оба они вызывают это .valueChanges() синхронно, поэтому .next() вызывается после subscribe. В реальной жизни valueChanges asyn c, поэтому subscribe вызывается раньше next.

=================== Отредактировано === ==================

, чтобы соединиться с реальной базой данных, вы должны изменить свой тест, чтобы он был асин c (потому что соединение асин c:

it('should confirm a record exists in storage',((done) => {
    Status$.subscribe( (Result:boolean) => {
      expect(Exists).toBeTrue();
      done()
    });
d}))
...