私はReact Nativeでアプリを構築しています。データベースとの通信頻度を最小限に抑えたいので、AsyncStorageを大量に使用しています。しかし、DBとAsyncStorageの間の翻訳にはバグの余地がたくさんあります。したがって、AsyncStorageには、自動化されたテストを実行していると信じているデータがあることを確認したいと思います。驚いたことに、私はオンラインでそれを行う方法に関する情報は見つかりませんでした。それを自分でしようとする私の試みはうまくいかない。冗談を使用してJestを使って非同期ストレージをテストするには?
:
it("can read asyncstorage",() => {
return AsyncStorage.getItem('foo').then(foo => {
expect(foo).not.toBe("");
}); });
このメソッドは、エラーで失敗しました:リターンを削除
TypeError: RCTAsyncStorage.multiGet is not a function
は、それが値を待たずに即座に実行する原因と不適切なテストを通過します。私はのawaitキーワードを使用してそれをテストしようとしたとき
私は正確に同じエラーで当たった:
it('can read asyncstorage', async() => {
this.foo = "";
await AsyncStorage.getItem('foo').then(foo => {
this.foo = foo;
});
expect(foo).not.toBe(""); });
成功しAsyncStorageの値に対してアサーションを実行する方法上の任意の提案は?私はJestを使い続けるのが好きですが、もしそれがいくつかの代替のテストライブラリでしかできないなら、私はそれを公開しています。
mockStorage.js
export default class MockStorage {
constructor(cache = {}) {
this.storageCache = cache;
}
setItem = jest.fn((key, value) => {
return new Promise((resolve, reject) => {
return (typeof key !== 'string' || typeof value !== 'string')
? reject(new Error('key and value must be string'))
: resolve(this.storageCache[key] = value);
});
});
getItem = jest.fn((key) => {
return new Promise((resolve) => {
return this.storageCache.hasOwnProperty(key)
? resolve(this.storageCache[key])
: resolve(null);
});
});
removeItem = jest.fn((key) => {
return new Promise((resolve, reject) => {
return this.storageCache.hasOwnProperty(key)
? resolve(delete this.storageCache[key])
: reject('No such key!');
});
});
clear = jest.fn((key) => {
return new Promise((resolve, reject) => resolve(this.storageCache = {}));
});
getAllKeys = jest.fn((key) => {
return new Promise((resolve, reject) => resolve(Object.keys(this.storageCache)));
});
}
とあなたのテストファイル内側:
このソリューションはあなたのユースケースでのみ動作し、下の解決策は受け入れられるものでなければなりません! – Ouadie
@Uuadie編集が必要なので、 'multiGet'と' multiSet'が定義されています。 @ brian-caseは特に 'multiGet'について質問していました。私は私の嘲笑を解決し、解決した解決策を避けています。 – jaygooby
あなたのアプリケーションを使用する際に 'Reason-native-implementation.js'モジュールから 'AsyncStorage'モジュールを見つけることができません。モック - 何か考えている理由? :) @jaygooby – jhm