2013-10-14 45 views
3

我使用this策略,延迟加载的东西,在我的AngularJS应用RequireJS:单元测试AngularJS延迟加载控制器

define([ 
    'src/services/dependency_resolver', // resolves promise when dependencies are `require`d 
    'json!modules.json' 
], function (dependencyResolver, modules) { 
    var app = angular.module('myApp', [ 'ngRoute' ]); 

    app.config(function ($controllerProvider, $routeProvider) { 
    app.lazy = { 
     controller: $controllerProvider.register 
     // <...> other providers 
    }; 

    angular.forEach(modules, function (moduleConfig) { 
     angular.forEach(moduleConfig.routes, function (route) { 
     $routeProvider.when(route.path, { 
      templateUrl: route.templateUrl, 
      controller: route.controller, 
      resolve: dependencyResolver(moduleConfig.dependencies) 
     }); 
     }); 
    }); 
    }); 

    return app; 
}); 

但我不知道什么是正确的方法测试延迟加载控制器。据注册这样的:

define(['src/app'], function (app) { 
    app.lazy.controller('MainCtrl', function() { 
    // 
    }); 
}); 

这是我目前的规格:

describe('`MainCtrl` controller', function() { 

    var Ctrl, 
     $scope; 

    beforeEach(angular.mock.module('myApp')); 

    beforeEach(function (done) { 
    require(['module/main'], done); 
    }); 

    beforeEach(function() { 
    angular.mock.inject(function ($rootScope, $controller) { 
     $scope = $rootScope.$new(); 

     Ctrl = $controller('MainCtrl', { 
     $scope: $scope 
     }); 
    }); 
    }); 

    it('should ...', function() { 
    console.log(Ctrl); 
    }); 

}); 

有了这个规范,被注册的控制时发生错误,因为app.lazy是不确定的。

所以问题是如何测试这样的控制器?

干杯!

回答

0

首先,感谢您提供的参考 - 这篇文章真的很有趣。

本文的作者正在使用AngularJs提供商来实现他的策略。问题是,AngularJs没有提供'规格'的提供者。所以我认为你应该在单元测试中省略这个策略。

在此基础上,我认为你应该在你的spec文件中加入AMD。 定义您的控制器是您规范中的依赖项。在此之后,您可能只需要求所有您的规格在main-spec.js某处并启动您的测试框架。

1

我在使用“lazy”属性编写我的单元测试注册我的控制器时遇到了类似的问题。这种方法的问题是,在单元测试的情况下,模块配置块将不会执行,因此,app.lazy将解析为undefined

要解决您的问题,应该使用提供者注册方法来替代模块上的对应方,而不是使用提供者注册方法来设置app.lazy的属性。换句话说,你的配置块现在应该变成:

`app.config(function ($controllerProvider, $routeProvider) { 
    app.controller = $controllerProvider.register 
    // <...> other providers 
    ....... 
}` 

而不是使用注册您的控制器(app.lazy):

`define(['src/app'], function (app) { 
    app.lazy.controller('MainCtrl', function() { 
    // 
    }); 
});` 

你可以这样定义:

`define(['src/app'], function (app) { 
    app.controller('MainCtrl', function() { 
    // 
    }); 
});` 

这应该工作!希望这可以帮助,请让我知道如果这工作或没有。