AngularJs单元测试Jasmine和RequireJs

时间:2013-07-02 12:30:23

标签: angularjs requirejs jasmine

我无法使用Jasmine和RequireJs为Angular JS应用程序进行单元测试。我创建了一个Plunker here

我遇到的问题是创建模块。如果我在控制器中包含Angular模块的设置,就像这样(参见Plunker中的Controller.js):

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

然后一切正常。但是,此模块是在另一个文件中创建的,因此不起作用。因此,如果我尝试使用Angular Mocks模块功能在我的测试中设置模块,我会收到一条错误,上面写着"没有模块:catalogManagementApp"。

如果查看ControllerTests.js文件,这是有道理的,因为在我调用Angular Mocks创建模块之前,RequireJS正在加载Controller:

beforeEach(module('catalogManagementApp'));

但是,我不知道如何让这个工作。正如您在ControllerTests.js文件中注释掉的代码中所看到的,我已经尝试在调用设置模块之后将Controller的require调用移动到,但是这会导致Jasmine测试运行器失败并且仍然相同没有模块错误

使用RequireJs代码运行Jasmine改编自this

1 个答案:

答案 0 :(得分:1)

我有很多问题变得棱角分明,嘲笑并需要与茉莉花玩得很好。最后答案很明显,你需要启动jasmine并确保它提供了你的规格。这是我所做的简化版本,我希望它能让你走上正确的道路。

/* 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>