Модульное тестирование ионной функции, которая возвращает или использует обещание - TS2304: Не удается найти имя «готово» - Жасмин / Карма для модульного тестирования ионных приложений - PullRequest
0 голосов
/ 31 мая 2018

Я пытаюсь выполнить модульное тестирование простой функции доступа к данным с помощью mocked Storage, которая просто использует словарь в памяти.

Когда я пытаюсь использовать функцию done(), я получаю сообщение об ошибке: TS2304: Cannot find name 'done'несмотря на то, что жасмин и карма, похоже, установлены правильно.

То, что я сделал, не устранило эту проблему:

  1. Проверено, что Jasmine находится в package.json
  2. Добавлено** / *. spec.ts для исключения раздела tsconfig.json?
  3. Изменена цель с "e5" на "e6" в tsconfig.json

data.ts:

export class DataProvider {
  private foo;
  public readonly fooKey
  public getFoo() { return this.foo; }
  public setFoo(bar: number) {
        this.foo = bar;
        this.storage.ready().then(() => {
            this.storage.set(this.fooKey, JSON.stringify(this.foo));
        });
    }
}

data.spec.ts:

include StorageMock;
include DataProvider;

 it('should have correct values after loading data',
       function() {
           comp.storage.set(comp.fooKey, JSON.stringify(0.1234));
           comp.storage.get(comp.fooKey).then(result => {
               expect(JSON.parse(result)).toEqual(0.1234);
               done(); // Error - TS2304: Cannot find name 'done'
           });
});

StorageMock:

export class StorageMock {
    private internal = [];

    public driver(): any {
        return '';
    }

    public ready(): Promise<any> {
        return new Promise(function(resolve: Function): void {
            resolve({});
        });
    }

    public get(key: string): Promise<any> {
        let getval = this.internal[key];
        return new Promise(function(resolve: Function): void {
            resolve(getval);
        });
    }

    public set(key: string, value: any): Promise<any> {
        this.internal.push({key : value});
        return new Promise(function(resolve: Function): void {
            resolve();
        });
    }

    public remove(key: string): Promise<any> {
        let index = this.internal.indexOf(key);
        if(index !== -1) {
            this.internal.splice(index,1);
        }
        return new Promise(function(resolve: Function): void {
            resolve();
        });
    }

    public clear(): Promise<any> {
        this.internal = [];
        return new Promise(function(resolve: Function): void {
            resolve();
        });
    }

    public length(): Promise<any> {
        let length = this.internal.length;
        return new Promise(function(resolve: Function): void {
            resolve(length);
        });
    }

    public keys(): Promise<any> {
        let keys = Object.keys(this.internal);
        return new Promise(function(resolve: Function): void {
            resolve(keys);
        });
    }

    public forEach(i: any): Promise<any> {
        return new Promise(function(resolve: Function): void {
            resolve();
        });
    }

1 Ответ

0 голосов
/ 31 мая 2018

Фактический ответ:

done - это не функция, которая является частью среды Jasmine - скорее она используется в объявлении теста как обратный вызов, когда тест завершается.Обратите внимание на следующее объявление (done):

it("should test something async", (done) => {
 ...do the testing...
 done();
}

Оригинальный ответ:

Хотя я не уверен, почему я не могу использовать done(), похоже, что fakeAsync, flushMicrotasks, tickвроде как "выполняет" работу (у меня все еще есть проблемы с асинхронностью при использовании макета хранилища).

...