1

私が作成した AngularJS + Angular AMD & RequireJS アプリケーションに Karma & Jasmine + Require Js ベースの単体テスト サポートを追加しようとしています。私はこの件で 2 日間頭を悩ませてきましたが、まだ契約を結ぶにはほど遠い状態です。

エラーが発生し続けます:

INFO [karma]: Karma v0.12.21 server started at http://localhost:9876/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 36.0.1985 (Mac OS X 10.9.4)]: Connected on socket 8oFHaa2hqJPs0ecgIXCa with id 31963369
Chrome 36.0.1985 (Mac OS X 10.9.4) ERROR: 'There is no timestamp for     ../www/scripts/specs/UserControllerTest.js!'

WARN [web-server]: 404: /www/scripts/specs/UserControllerTest.js
Chrome 36.0.1985 (Mac OS X 10.9.4) ERROR
  Uncaught Error: Script error for: specs/UserControllerTest
  http://requirejs.org/docs/errors.html#scripterror
  at /usr/local/lib/node_modules/requirejs/require.js:141

私のコードは次のとおりです。

  1. Karma 構成ファイル:

    // Karma configuration
    // Generated on Fri Aug 15 2014 20:49:40 GMT+1000 (EST)
    
    module.exports = function(config) {
     config.set({
    
    // base path that will be used to resolve all patterns (eg. files, exclude)
    basePath: '.',
    
    
    // frameworks to use
    // available frameworks: https://npmjs.org/browse/keyword/karma-adapter
    frameworks: ['jasmine', 'requirejs'],
    
    
    // list of files / patterns to load in the browser
    files: [
     'test-main.js',
     {pattern: 'specs/*.js', included: true}
    ],
    
    
    // list of files to exclude
    exclude: [
    ],
    
    
    // preprocess matching files before serving them to the browser
    // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor
     preprocessors: {
     },
    
    
     // test results reporter to use
    // possible values: 'dots', 'progress'
    // available reporters: https://npmjs.org/browse/keyword/karma-reporter
    reporters: ['progress'],
    
    
    // web server port
    port: 9876,
    
    
    // enable / disable colors in the output (reporters and logs)
    colors: true,
    
    
    // level of logging
    // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN ||   config.LOG_INFO || config.LOG_DEBUG
    logLevel: config.LOG_INFO,
    
    
    // enable / disable watching file and executing tests whenever any file changes
    autoWatch: true,
    
    
    // start these browsers
    // available browser launchers: https://npmjs.org/browse/keyword/karma-launcher
    browsers: ['Chrome'],
    
    
    // Continuous Integration mode
    // if true, Karma captures browsers, runs the tests and exits
    singleRun: false
     });
    };
    
  2. 私の test-main.js ファイル。

     var allTestFiles = [];
     var TEST_REGEXP = /(spec|test)\.js$/i;
    
     var pathToModule = function(path) {
       return path.replace(/^\/base\//, '').replace(/\.js$/, '');
     };
    
     Object.keys(window.__karma__.files).forEach(function(file) {
       if (TEST_REGEXP.test(file)) {
         // Normalize paths to RequireJS module names.
         allTestFiles.push(pathToModule(file));
       }
     });
    
     require.config({
       // Karma serves files under /base, which is the basePath from your config file
       baseUrl: '../www/scripts',
    
       // alias libraries paths
             paths: {
                 'angular': '../libs/angular',
                 'angular-route': '../libs/angular-route',
                 'angular-animate':'../libs/angular-animate',
                 'angular-mocks':'../libs/angular-mocks',
                 'angularAMD': '../libs/angularAMD.min',
                 'Framework7':'../libs/framework7',
                 'UserController':'controller/UserCtrl',
                 'WebCallManager':'services/WebCallManager'
             },
    
             // Add angular modules that does not support AMD out of the box, put it in a shim
             shim: { 
                 'angularAMD': ['angular'],
                 'angular-route': ['angular'],
                 'angular-animate':['angular'],
                 'angular-mocks':['angular'],
                 'Framework7':{exports: 'Framework7'}
             },
    
             //kick start application
             //deps: ['app'],
    
       // dynamically load all test files
       deps: allTestFiles,
    
       // we have to kickoff jasmine, as it is asynchronous
       callback: window.__karma__.start
     });
    
  3. そして、私の単体テストは次のとおりです。

         describe('UserController', function () {
    
         var scope,controller;
    
         //mock Application to allow us to inject our own dependencies
         beforeEach(angular.mock.module('app'));
    
    
         //mock the controller for the same reason and include $rootScope and $controller
         beforeEach(angular.mock.inject(function($rootScope, $controller) {
             //create an empty scope
             scope = $rootScope.$new();
             //declare the controller and inject our empty scope
             $controller('UserController', {$scope: scope});
    
           }));
    
    
    
         it('checks the controller name', function () {
             expect(scope.name).toBe('Superhero');
         });        
     });
    

プロジェクトのすべてのコードをここにリンクするためにアップロードしました。これを手伝ってくれる人は誰でも大歓迎です。私はこれで私のテザーの終わりにいると思います。

4

2 に答える 2

1

marcoseu の言うとおりです。このThere is no timestamp for... エラーは、カルマがファイルを見つけられないことを意味しますが、他にもあります。

カルマのベース パスをプロジェクト ルートにすることをお勧めします。これにより、カルマがファイル パスを相対パスではなく絶対パスにすることを回避し、物事をよりシンプルに保ち、パス参照の問題を回避します (少なくとも私の Windows OS では)。

テストは、必要なオブジェクトが完全にロードされていることを確認できるように、require モジュール (つまり、define を使用) である必要があります。http://karma-runner.github.io/0.12/plus/requirejs.htmlでサンプル テストを参照してください。

カルマ.config.js basePath: "../", files: [ 'test/test-main.js', {pattern: 'test/specs/*.js', included: false}, {pattern: 'www/**/*.js', included: false}, ],

これで、ファイルはすべて /base の下で Karma によって提供されます。

test-main.js require.config({ baseUrl: "/base/www/scripts",

デバッグ

しかし、最も重要なことは、これらすべてをデバッグできることです。Karma を実行し、Karma が作成した chrome インスタンスに切り替えて、デバッグ ボタンをクリックし、chrome 開発者ツールを開きます。コンソールとソースファイルを確認してください。特に、debug.html のソース。一番下に、カルマが提供するすべてのファイルの定義があります。

ブレークポイントを設定してからページを更新して、実行中のテストを監視することもできます。テストエラーが発生する理由を自分で確認できます。勝つ。

于 2014-08-22T06:16:01.153 に答える
0

エラーは、問題のファイルにアクセスできないことをThere is no timestamp for...意味します。カルマがアクセスできるようにディレクトリkarmaを定義する必要があります。www次のことを試してください。

カルマ.config.js files: [ 'test-main.js', {pattern: './specs/*.js', included: true}, {pattern: '../../www/**/*.js', included: false} ],

angularAMDプロジェクトのkarma.confと、ファイルに関する Karma のドキュメントを参照してください。

于 2014-08-18T15:01:51.820 に答える