3

Jasmine と RequireJs を使用して、Angular JS アプリで単体テストを機能させるのに問題があります。ここでプランカーを作成しました

私が抱えている問題は、モジュールの作成に関するものです。コントローラーに Angular モジュールのセットアップを含めると、次のようになります (Plunker の Controller.js を参照)。

angular.module('catalogManagementApp', []);

その後、すべて正常に動作します。ただし、このモジュールは別のファイルで作成されるため、これは機能しません。したがって、Angular Mocks モジュール関数を使用してテストでモジュールをセットアップしようとすると、「No module: catalogManagementApp」というエラーが表示されます。

ControllerTests.js ファイルを見ると、モジュールを作成するために Angular Mocks を呼び出す前に RequireJS がコントローラーをロードしているため、これは理にかなっています。

beforeEach(module('catalogManagementApp'));

ただし、これを機能させる方法がわかりません。ControllerTests.js ファイルのコメントアウトされたコードからわかるように、モジュールをセットアップするための呼び出しの後に Controller の require 呼び出しを移動しようとしましたが、これにより Jasmine テストランナーが失敗し、同じモジュールなしエラーが発生します.

RequireJs コードを使用した Jasmine の実行は、これから適応されました。

4

1 に答える 1

1

私は角度を付けたり、嘲笑したり、ジャスミンと仲良くする必要があるなど、多くの問題を抱えていました。最終的に答えは、ジャスミンを起動して、仕様に確実に対応する必要があることは明らかでした。これは私が行ったことの縮小版です。正しい軌道に乗るのに役立つことを願っています。

/* this would be 'main'*/
require.config({       
    paths: {
        'jasmine-boot': 'lib/jasmine/boot',
        'jashtml': 'lib/jasmine/jasmine-html',
        'jasmine': 'lib/jasmine/jasmine',            
        'angular': 'lib/angular',           
        'angular-mocks': 'lib/angular-mocks',
        'app': 'src/app',           
        'test': 'spec/first.spec',
    },
    shim: {
        'jashtml': {
            deps: ['jasmine']
        },
        'jasmine-boot': {
            deps: ['jasmine', 'jashtml']
        },            
        'angular': {
            exports: "angular"
        },            
        'angular-mocks': {
            exports: "angular.mock",
            deps: ['angular']
        },            
        'test': {
            deps: ['angular-mocks']
        }
    }
});

require(['jasmine-boot'], function () {
    require(['test'], function () {
        //trigger Jasmine
        window.onload();
    });
});

/*this would be 'first.spec'*/
 define(['app'], function (app) {

    var  mockScope, controller;

    function init() {
                return  angular.mock.inject(function ($injector, _$rootScope_, _$controller_) {                  
                    mockScope = _$rootScope_.$new();             

                    controller = _$controller_('testCtrl', {                        
                        $scope: mockScope
                    });

                 });
            };

    describe('expect require', function () {

        beforeEach(module("app"));
        beforeEach(init());

        describe('to be ', function() {
            it('clever', function () {                
                var foo = "bar";
                controller.setValue(foo);
                expect(controller.value).toBe(foo);
            });
        });
    });
});

/*jasmine spec runner*/
<!DOCTYPE html>
    <html>
    <head>
        <meta charset="utf-8">
        <title>Jasmine Spec Runner v2.1.3</title>
        <link rel="shortcut icon" type="image/png" href="jasmine_favicon.png">
        <link rel="stylesheet" href="jasmine.css">
        <script src="../../require.js" data-main="main.js"></script>
    </head>
    <body>
    </body>
 </html>
于 2015-04-28T19:25:21.377 に答える