Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 用Jasmine编写单元测试,需要角JS的Karma中的JS吗?_Angularjs_Unit Testing_Requirejs_Jasmine_Karma Runner - Fatal编程技术网

Angularjs 用Jasmine编写单元测试,需要角JS的Karma中的JS吗?

Angularjs 用Jasmine编写单元测试,需要角JS的Karma中的JS吗?,angularjs,unit-testing,requirejs,jasmine,karma-runner,Angularjs,Unit Testing,Requirejs,Jasmine,Karma Runner,我已经用Angular JS做了一个库管理应用程序,Mongo Lab将作为DB的一部分,在封装单元测试用例时,我面临着需要JS依赖性的问题 Error: [$injector:modulerr] Failed to instantiate module lmaApp due to: Error: [$injector:nomod] Module 'lmaApp' is not available! 以上我所面临的错误,请帮助我摆脱这一困境 MyCode: Controller.js def

我已经用Angular JS做了一个库管理应用程序,Mongo Lab将作为DB的一部分,在封装单元测试用例时,我面临着需要JS依赖性的问题

Error: [$injector:modulerr] Failed to instantiate module lmaApp due to:
Error: [$injector:nomod] Module 'lmaApp' is not available! 
以上我所面临的错误,请帮助我摆脱这一困境

MyCode:

Controller.js

define(
    ['modules'],
    function(lmaApp) {
        lmaApp.controller('gridControl',['$scope' , '$http' , 'internal' , 'commonValues', function($scope , $http , internalFn , commonValues){
            jQuery('ul.navbar-nav li').removeClass('active');
            jQuery('ul.navbar-nav li:nth-child(1)').addClass('active');
            $('.loaderImg').removeClass('no-loading');
            var lmaTableData = internalFn.getTableData(commonValues.mongoAPIurl,commonValues.bookTableName,'');
                    var promise = lmaTableData
                    .success(function(tbData) {
                        if(tbData.length > 0){
                            $scope.nobook=0;
                            $scope.books =tbData;
                        }
                        else{
                           $scope.nobook =1; 
                        }
                    }).then(function (response) {$('.loaderImg').addClass('no-loading');});
        }]);
});
define(
    ['app_config','angularRoute'],
    function() {
        var lmaApp =angular.module('lmaApp',['ngRoute'])
        return lmaApp;
    });
define(
    ['angular','angularRoute','modules'],
    function() {

            angular.element(document).ready(function() {
                angular.bootstrap(document, ['lmaApp'], {});
            });

    });
define(['angular', 'angular-mocks'], function() {
    describe('gridControl', function(){

      beforeEach(module('lmaApp'));

      it('should get the book table Datas', inject(function($controller) {
        var scope = {},
            ctrl = $controller('gridControl', {$scope:scope});

        expect(scope.phones.length).not.toEqual(0);
      }));

    });
});
modules.js

define(
    ['modules'],
    function(lmaApp) {
        lmaApp.controller('gridControl',['$scope' , '$http' , 'internal' , 'commonValues', function($scope , $http , internalFn , commonValues){
            jQuery('ul.navbar-nav li').removeClass('active');
            jQuery('ul.navbar-nav li:nth-child(1)').addClass('active');
            $('.loaderImg').removeClass('no-loading');
            var lmaTableData = internalFn.getTableData(commonValues.mongoAPIurl,commonValues.bookTableName,'');
                    var promise = lmaTableData
                    .success(function(tbData) {
                        if(tbData.length > 0){
                            $scope.nobook=0;
                            $scope.books =tbData;
                        }
                        else{
                           $scope.nobook =1; 
                        }
                    }).then(function (response) {$('.loaderImg').addClass('no-loading');});
        }]);
});
define(
    ['app_config','angularRoute'],
    function() {
        var lmaApp =angular.module('lmaApp',['ngRoute'])
        return lmaApp;
    });
define(
    ['angular','angularRoute','modules'],
    function() {

            angular.element(document).ready(function() {
                angular.bootstrap(document, ['lmaApp'], {});
            });

    });
define(['angular', 'angular-mocks'], function() {
    describe('gridControl', function(){

      beforeEach(module('lmaApp'));

      it('should get the book table Datas', inject(function($controller) {
        var scope = {},
            ctrl = $controller('gridControl', {$scope:scope});

        expect(scope.phones.length).not.toEqual(0);
      }));

    });
});
app_config.js

define(
    ['modules'],
    function(lmaApp) {
        lmaApp.controller('gridControl',['$scope' , '$http' , 'internal' , 'commonValues', function($scope , $http , internalFn , commonValues){
            jQuery('ul.navbar-nav li').removeClass('active');
            jQuery('ul.navbar-nav li:nth-child(1)').addClass('active');
            $('.loaderImg').removeClass('no-loading');
            var lmaTableData = internalFn.getTableData(commonValues.mongoAPIurl,commonValues.bookTableName,'');
                    var promise = lmaTableData
                    .success(function(tbData) {
                        if(tbData.length > 0){
                            $scope.nobook=0;
                            $scope.books =tbData;
                        }
                        else{
                           $scope.nobook =1; 
                        }
                    }).then(function (response) {$('.loaderImg').addClass('no-loading');});
        }]);
});
define(
    ['app_config','angularRoute'],
    function() {
        var lmaApp =angular.module('lmaApp',['ngRoute'])
        return lmaApp;
    });
define(
    ['angular','angularRoute','modules'],
    function() {

            angular.element(document).ready(function() {
                angular.bootstrap(document, ['lmaApp'], {});
            });

    });
define(['angular', 'angular-mocks'], function() {
    describe('gridControl', function(){

      beforeEach(module('lmaApp'));

      it('should get the book table Datas', inject(function($controller) {
        var scope = {},
            ctrl = $controller('gridControl', {$scope:scope});

        expect(scope.phones.length).not.toEqual(0);
      }));

    });
});
我的规范文件

controllerSpec.js

define(
    ['modules'],
    function(lmaApp) {
        lmaApp.controller('gridControl',['$scope' , '$http' , 'internal' , 'commonValues', function($scope , $http , internalFn , commonValues){
            jQuery('ul.navbar-nav li').removeClass('active');
            jQuery('ul.navbar-nav li:nth-child(1)').addClass('active');
            $('.loaderImg').removeClass('no-loading');
            var lmaTableData = internalFn.getTableData(commonValues.mongoAPIurl,commonValues.bookTableName,'');
                    var promise = lmaTableData
                    .success(function(tbData) {
                        if(tbData.length > 0){
                            $scope.nobook=0;
                            $scope.books =tbData;
                        }
                        else{
                           $scope.nobook =1; 
                        }
                    }).then(function (response) {$('.loaderImg').addClass('no-loading');});
        }]);
});
define(
    ['app_config','angularRoute'],
    function() {
        var lmaApp =angular.module('lmaApp',['ngRoute'])
        return lmaApp;
    });
define(
    ['angular','angularRoute','modules'],
    function() {

            angular.element(document).ready(function() {
                angular.bootstrap(document, ['lmaApp'], {});
            });

    });
define(['angular', 'angular-mocks'], function() {
    describe('gridControl', function(){

      beforeEach(module('lmaApp'));

      it('should get the book table Datas', inject(function($controller) {
        var scope = {},
            ctrl = $controller('gridControl', {$scope:scope});

        expect(scope.phones.length).not.toEqual(0);
      }));

    });
});

这里我对require js dependency有一个疑问,就像我不得不提到的
modules.js
在Spec文件中也是一个依赖项一样。

你的controller-Spec.js是错误的,你需要调用它的依赖项,即你的
module.js
app_config.js
controller.js
'angularRoute'
。在其他ot中,使您的应用程序能够增强

像这样试试

define(['angular', 'angular-mocks','modules', 'app_config', 'Controller', 'angularRoute'], function() { ... }
但我仍然无法确定它是否适合你。因为如果你的配置有错误。它将被打破。在单元测试中使用requireJS和AngularJS在配置中是非常棘手/复杂的

您应该阅读更多关于requireJS配置的信息,并使用
shim
为脚本定义依赖项。当你的应用程序变得越来越大时,它会变得更加清晰,更容易处理。例如,您可以在配置文件中执行以下操作:

shim: {
    'modules': ['angular', 'app_config', 'angular-mocks'],
    'app_config': ['angular', 'angularRoute', 'modules'],
    'Controller': ['modules']
}
您的controller-spec.js将如下所示

define(['modules', 'app_config', 'Controller'], function(){ ... });
同样在element ready上引导angular不是测试的好主意。它可能会在业力的负载模拟中引起一些冲突。我不确定,但感觉不对

Sencond您的
app_config.js
modules.js
是相互依赖的。如果有什么东西需要订货,你怎么看。哪个需要先加载?因为两者都要求在被requireJS调用之前加载另一个

仍然我认为我的解决方案行不通。因为你的配置看起来很错误