typescript - Enhetstestning av Ionic-funktion som returnerar eller använder ett löfte - TS2304: Kan inte hitta namnet 'done' - Jasmine/Karma för enhetstestning av Ionic-appar
Jag försöker enhetstesta en enkel dataåtkomstfunktion med mockad Storage som helt enkelt använder ett ordbok i minnet.
När jag försöker använda done()-funktionen får jag felet: TS2304: Kan inte hitta namnet 'done' trots att jasmine och karma verkar vara installerade korrekt.
Saker jag har gjort som inte har löst detta problem:
- Verifierad Jasmine finns i packages.json
- Lade till **/*.spec.ts i exclusions-avsnittet i tsconfig.json?
- Ändrade mål från "e5" till "e6" i 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();
});
}
Svar #1
Faktiskt svar:
done är inte en funktion som är en del av Jasmine-ramverket - det används istället inom ett tests deklaration som en callback för när testet avslutas. Notera nedan deklarationen (done):
it("should test something async", (done) => {
...do the testing...
done();
}
Original svar:
Även om jag inte är säker på varför jag inte kan använda done(), verkar det som att använda fakeAsync, flushMicrotasks, tick på något sätt får jobbet "gjort" (jag har fortfarande vissa asynkrona problem med lagringsmocken).
