Описание теста кармы Cordova sqliteplugin

Привет, я хочу реализовать несколько тестовых примеров для моего приложения ionic framework, которое использует плагин Cordova sqlite для получения данных из базы данных sqlite.

Я очень новичок в написании тестов для angularjs.

Моя цель — проверить, поступают ли данные для моего сервиса.

Что ж, в моем app.js я открываю базу данных следующим образом:

angular.module('starter', ['ionic','starter.services', 'starter.controllers', 'starter.config','ngCordova'])

.run(function($ionicPlatform, $cordovaSQLite, $ionicLoading) {
  $ionicPlatform.ready(function() {

    var dbName = 'testDB.db';
    if(window.cordova) {
      window.plugins.sqlDB.copy(dbName);
      db = $cordovaSQLite.openDB(dbName);
    }

    ....

Мои services.js выглядят так:

angular.module('starter.services', ['ngCordova'])

.factory('ProductService',function($cordovaSQLite){

    var getAllProducts = function() {
        var productList = [];

        var query = "SELECT c.name as name, c.id as id FROM cars as c ORDER BY c.name";
        $cordovaSQLite.execute(db, query, []).then(function(res) {

            if(res.rows.length > 0) {

                for(var i = 0; i < res.rows.length; i++) {
                    productList.push({id: res.rows.item(i).id, name: res.rows.item(i).name});
                }

            }
        }, function (err) {
            console.error(err);
        });

        return productList;
    };

    return {
        getAllProducts: getAllProducts
    };

});

И мое тестовое описание для проверки сервиса выглядит так:

describe('ProductService unit tests', function () {
    var ProductService;

    beforeEach(module('starter.services'));
    beforeEach(angular.mock.module('starter'));

    beforeEach(inject(function(_ProductService_) {
        ProductService = _ProductService_;
    }));

    it('can get an instance', inject(function(ProductService) {
        expect(ProductService).toBeDefined();
    }));

    //THIS TEST FAILS
    it('should get some products from the database', inject(function(ProductService) {
        expect(ProductService.getAllProducts().length).toBeGreaterThan(0);
    }));
});

Если я запускаю тест, я получаю:

TypeError: 'null' is not an object (evaluating 'n.transaction')

Я думаю, это потому, что база данных на самом деле не инициализируется во время теста, поэтому я попытался смоделировать стартовое приложение, но это не решило проблему. Я пытался найти это в Google, но не смог найти примеров или руководств по карме с помощью sqlite и angularjs.

Спасибо за любую помощь.


person Kingalione    schedule 06.03.2015    source источник
comment
Любое обновление по этому поводу, я поражен тем же самым   -  person mahi    schedule 19.03.2015


Ответы (1)


У меня была такая же проблема, и оказалось, что БД не была инициализирована. В итоге я создал фабрику для БД для внедрения необходимых вам сервисов.

.factory('DB', function($cordovaSQLite) {
var db = $cordovaSQLite.openDB("my.db");
$cordovaSQLite.execute(db, "CREATE TABLE IF NOT EXISTS cards (id integer primary key,question  text, answer text)");
  return db;
  })

Инъекция в контроллере:

.controller('CardsCtrl', function($scope, $http, $ionicSwipeCardDelegate,$cordovaSQLite,DB) {

   var query = "SELECT * FROM cards ";
  $cordovaSQLite.execute(DB, query,[]).then(function(res) {
  if(res.rows.length > 0) {
    ....do stuff...                                                           
 } else {

    }
    }, function (err) {
   console.error(err);
     });

    });
person elcrion1090238    schedule 15.04.2015