Имитация SQLite не работает на ionic 5, проблема в макетном классе SQLite

#sqlite #unit-testing #cordova #ionic-framework #karma-jasmine

#sqlite #модульное тестирование #кордова #ionic-framework #карма-жасмин

Вопрос:

Описание: — модульный тест проекта ionic-angular для макета SQLite не работает. Ниже приведен макет класса. Я хочу выполнить модульный тест для cordova SQLite, используя платформу jasmine

 declare var SQL;
export class SQLiteObject {
    _objectInstance: any;

    constructor(_objectInstance: any) {
      this._objectInstance = _objectInstance;
    }

    executeSql(statement: string, params: any): Promise<any> {

      return new Promise((resolve, reject) => {
        try {
          console.log(statement);
          const st = this._objectInstance.prepare(statement, params);
          const rows: Array<any> = [] ;
          while (st.step()) {
            const row = st.getAsObject();
            rows.push(row);
          }
          const payload = {
            rows: {
              item(i) {
                return rows[i];
              },
              length: rows.length
            },
            rowsAffected: this._objectInstance.getRowsModified() || 0,
            insertId: this._objectInstance.insertId || void 0
          };
          // save database after each sql query

          const arr: ArrayBuffer = this._objectInstance.export();
          localStorage.setItem('database', String(arr));
          resolve(payload);
        } catch (e) {
          reject(e);
        }
      });
    }

    sqlBatch(statements: string[], params: any): Promise<any> {
      return new Promise((resolve, reject) => {
        try {
          const rows: Array<any> = [];
          for (const statement of statements) {
            console.log(statement);
            const st = this._objectInstance.prepare(statement, params);
            while (st.step()) {
                const row = st.getAsObject();
                rows.push(row);
            }
          }
          const payload = {
            rows: {
              item(i) {
                return rows[i];
              },
              length: rows.length
            },
            rowsAffected: this._objectInstance.getRowsModified(),
            insertId: this._objectInstance.insertId || void 0
          };
          // save database after each sql query

          const arr: ArrayBuffer = this._objectInstance.export();
          localStorage.setItem('database', String(arr));
          resolve(payload);
        } catch (e) {
          reject(e);
        }
      });
    }
}



export class SQLiteMock {

  public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
    let db;
    const storeddb = localStorage.getItem('database');

    if (storeddb) {
      const arr = storeddb.split(',');
      db = new SQL.Database(arr);
    } else {
       db = new SQL.Database();
    }

    return new Promise((resolve, reject) => {
      resolve(new SQLiteObject(db));
    });
  }
}

  

Ошибка: — Sql не определен
Я просто следил за этой статьей https://www.techiediaries.com/mocking-native-sqlite-plugin/
Окружающая среда :-
Ionic 5
Angular 9

Пожалуйста, поделитесь любым альтернативным подходом и возможностями.. Спасибо.

Ответ №1:

На самом деле, это вызвано вашим sql.js слишком высокая версия. declare var SQL должен быть заменен на declare const initSqlJs: any; Полный код SqliteMock тогда выглядит следующим образом:

 import { SQLiteDatabaseConfig } from '@ionic-native/sqlite/ngx';
import { SQLiteObject } from './sqlite-object';
declare const initSqlJs: any;
const sqlConfig = {
    locateFile: filename => `./assets/js/sql-wasm.wasm`
};

export class SqliteMock {
    public create(config: SQLiteDatabaseConfig): Promise<SQLiteObject> {
        return initSqlJs(sqlConfig).then((sql) => {
            const db = new sql.Database();
            return new Promise( (resolve, reject) => {
                resolve(new SQLiteObject(db));
            });
        });
    }
}
  

Ссылка на код

И index.html затем следует ввести sql-wasm.js Также не забудьте поставить sql-wasm.js и sql-wasm.wasm в папке assets / js /

Я не знаю английского, поэтому это мой ответ через переводчик.