Cordova s​​qliteplugin 业力测试说明

Posted

技术标签:

【中文标题】Cordova s​​qliteplugin 业力测试说明【英文标题】:Cordova sqliteplugin karma test description 【发布时间】:2015-03-06 12:52:20 【问题描述】:

您好,我想为我的 ionic 框架应用程序实现一些测试用例,该应用程序使用 cordova s​​qliteplugin 从 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')

我认为是因为在测试期间数据库没有真正初始化,所以我尝试模拟启动应用程序,但它没有解决问题。我试图用谷歌搜索,但找不到任何使用 sqlite 和 angularjs 的 karma 示例或教程。

感谢您的帮助。

【问题讨论】:

对此有任何更新,我对同样的事情感到震惊 【参考方案1】:

我遇到了同样的问题,结果发现数据库没有初始化。 我最终为 db 创建了工厂以注入您需要的服务

.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);
     );

    );

【讨论】:

以上是关于Cordova s​​qliteplugin 业力测试说明的主要内容,如果未能解决你的问题,请参考以下文章

angular2应用程序中的业力测试异常

Angular 2 业力设置问题——业力启动但不运行测试

对铬的业力测试

业力覆盖总是空的

找不到业力覆盖

执行业力测试时出错