【问题标题】:Unit testing controllers (Jasmine/Angular) that run code when the page loads页面加载时运行代码的单元测试控制器(Jasmine/Angular)
【发布时间】:2014-09-25 14:29:10
【问题描述】:

我正在尝试对我在 jasmine 测试框架中编写的一些 Angular js 控制器进行单元测试。我已经完成所有设置,以便能够创建控制器实例并传入模拟服务。

但是,我有几行代码在页面加载时运行。

$scope.tags = [];
$scope.noData = false;

$scope.generateSearchResults = function(input){
    searchAPI.executeSearch(input).then(function(res){
        $scope.tags = res.data;
    });
};

//does some post processing on tags
$scope.checkNumberOfResults = function(){
    if($scope.tags.length < 1){
        $scope.noData = true;
    }
}

//this is the code that runs when the page loads.. normally I want this behavior,
//but for my jasmine unit tests, I don't want the controller running any code on
//instantiation
$scope.$watch('$viewContentLoaded', function(){
    $scope.searchQuery = $routeParams.query; //grabs from the url
    $scope.generateSearchResults($scope.searchQuery){
    .then(function(res){
        $scope.checkNumberOfResults();
    });
});

因此,如果您知道,当页面加载时,我想从 url 中获取查询字符串,然后显示搜索结果。问题是,我不希望这段代码在测试时运行,至少不是为了我的单元测试。也许当我做一些集成测试时,我希望能够模拟页面加载,但现在,我想在控制器中对我的其他一些功能进行单元测试,而不必调用搜索 API 服务。.

这有意义吗?有人对在哪里进行此操作有任何建议吗?

【问题讨论】:

    标签: angularjs unit-testing controller jasmine onload


    【解决方案1】:

    您可以使用解析ngRouteuiRoutersearchQuery 注入控制器,而不是关注$viewContentLoaded 事件。这使您可以在测试中模拟searchQuery,并且独立于页面加载和$routeParams

    // code for ngRouter
    ...
    controller: 'MyCtrl',
    resolve: {
       searchQuery: function ($route) {
         // grabs search query from URL
         return $route.current.params.query;
       }
    }
    

    然后将searchQuery 注入您的控制器:

    module.controller('MyCtrl', function ($scope, searchQuery) {
    
      $scope.$watch('searchQuery', function(newValue){
        // ignore undefined etc.      
        if (!newValue) { return; }
        $scope.generateSearchResults($scope.searchQuery){
        .then(function(res){
          $scope.checkNumberOfResults();
        });
      });
    
    });
    

    【讨论】:

    • 我有一个 app.js 文件,它本质上链接了模块并确定哪些模板获取哪些控制器。 ng路由器代码会进去吗?
    • 我暂时喜欢这个解决方案,基本上每当 searchQuery 执行时我的结果都会更新,这很酷
    • 是的,使用angular模块的config方法链接模板和控制器。 angular.module('app', ['ngRoute']).config(function ($routeProvider) { $routeProvider.when('/route', { templateUrl: 'my-tpl.html, controller: 'MyCtrl', resolve: { /*resolve*/ } }); });
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多