Ionic Couchbase Lite Karma Jasmine 单元测试

Ionic Couchbase Lite Karma Jasmine Unit Testing

经过一番努力,我成功地使用 karma 进行了 jasmine 测试 运行ning,但我似乎找不到这个问题的答案:

我如何 运行 我的 jasmine 在实际设备上测试以测试与 couchbase lite 数据库相关的功能?

我正在使用这个:https://github.com/couchbaselabs/ng-couchbase-lite

这是我的测试:

     describe('SetupService tests', function() {
        
        it('SetupService should instantiate', function() { 
            expect(SetupService).toBeDefined();
        }); 
        
        it('it should instantiate database', function() { 
            var database = null; 
            SetupService.setupConfig();
            expect(database).not.toBeNull();
        });  
    });

所以我需要 运行 在实际设备上进行测试,以便成功创建数据库。我是单元测试的新手,目前只使用 karam cli。

设置配置显示它需要 couchbase lite 和 cordova:

    var setupConfig = function() {
         console.log("set up config");
         var deferred = $q.defer();

         if(!window.cblite) { 
             deferred.reject('Couchbase Lite not installed');  
         } 
         else {
             cblite.getURL(function(err, url) {
                 console.log("cblite get url");
                 if(err) {
                     console.log(err);
                     deferred.reject("There was an error getting the database URL");  
                 }
                 else{
                     database = new $couchbase(url, appDbName);  
                     database.createDatabase().then(function(result) {
                         var views = setupViews();
                         database.createDesignDocument("_design/todo", views);
                         database.listen();
                         deferred.resolve(true); 
                     }, function(error) {
                         // we will not reject this err, as it is caused when a db already exists
                         // so it will happen everytime
                         deferred.resolve(err);  
                     });
                 } 
             }); 
         } 

         return deferred.promise;
     };
  1. 在 www/

    中创建一个名为 tests 的文件夹

    .

  2. Here

    下载最新的独立 jasmine zip

    一个。将 lib 文件夹放入 www/tests

    b。复制 SpecRunner.htmlwww/

.

  1. 让你的 SpecRunner.html 看起来和你的 index.html
  2. 完全一样

.

  1. 然后在</head>

    之前将jasmine css和脚本添加到SpecRunner.html
    <link rel="shortcut icon" type="image/png" href="tests/lib/jasmine-x.x.x/jasmine_favicon.png">
    <link rel="stylesheet" href="tests/lib/jasmine-x.x.x/jasmine.css">
    <style>
        .jasmine_html-reporter{
            width: 100%;
            margin: 200px 0px;
        } 
    </style> 
    
  2. body标签末尾,添加jasmine lib脚本:

    <script src="tests/lib/jasmine-x.x.x/jasmine.js"></script>
    <script src="tests/lib/jasmine-x.x.x/jasmine-html.js"></script>
    <script src="tests/lib/jasmine-x.x.x/boot.js"></script>
    

.

  1. www/tests/lib/jasmine-x.x.x/boot.js

    中打开boot.js

    查找 window.load 函数并替换为:

      window.onload = function() {
        if (currentWindowOnload) {
          currentWindowOnload();
        }
        jasmine.initialize  = htmlReporter.initialize;
        jasmine.execute     = env.execute;
      };
    

.

  1. 在开始页面的 ctrl 中,加载所有内容后添加:

         if(window.jasmine){  
             console.log("---------------------------------------------------------");
             console.log("STARTING JASMINE...");  
             jasmine.initialize();
             jasmine.execute(); 
             console.log("---------------------------------------------------------");
             console.log("JASMINE INITIALED");
             console.log("---------------------------------------------------------");
         }
    

    我个人 bootstrap angular 手动,所以我在 angular 被 bootstrapped 和我的主 Ctrl 加载后启动 jasmine:

    window.ionic.Platform.ready(function() {
        console.log("device ready");  
        angular.element(document).ready(function() {
            angular.bootstrap(document, ['myApp']); 
        }); 
    }); 
    

    然后在我从 Couchbase 加载文档后,在我的 Ctrl 中启动 jasmine。

.

  1. 终于运行测试:

    index.html 重命名为 index_backup.htmlSpecRunner.html 重命名为 index.html

    和运行ionic run android --device

.

  1. 使用 Makefile 自动执行第 8 步:

    set-test: 
        @if [ -f "www/SpecRunner.html" ]; \
        then \
            mv www/index.html www/index_backup.html; \
            mv www/SpecRunner.html www/index.html; \
        else \
            echo "test already set"; \
        fi
    
    unset-test:
        @if [ -f "www/SpecRunner.html" ]; \
        then \
            echo "test already unset"; \
        else \
            mv www/index.html www/SpecRunner.html;  \
            mv www/index_backup.html www/index.html; \
        fi       
    test:  
        make set-test    
        ionic run android --device 
    
  2. 样本测试

    describe('AccountsCtrl', function() { 
    
        var $scope;
        var app; 
        var $ionicSideMenu;
        var helper;
    
        var params = {
            name : 'Test Person',
            id: '112654'
        };
    
    
        beforeAll(function(done){  
            app = AppService;
            helper = getService("ActivitiesHelper");  
            $state.go('app.activities',params);  
    
        // wait for the state to change
            setTimeout(function(){ 
                $scope = getScope("activities"); 
                done();
            },1000) 
    
        });
    
    
        it('expects $scope.app to be defined', function() { 
            expect($scope.app).toBeDefined();
        });     
    
    
    });