【问题标题】:Jasmine unit test failing with resolve values in controller茉莉花单元测试失败,控制器中的解析值
【发布时间】:2015-09-22 13:37:21
【问题描述】:

在开始之前,我遵循了此处的建议但没有成功:How can I test a controller with resolve properties in AngularJS?

我是我的 app.js,我有一个简单的解决方案:

var app = angular.module('myApp', ['ui.router']);

app.config(function($stateProvider, $urlRouterProvider) {

$stateProvider

    .state('index', {
        url: '/index',
        templateUrl: 'html/home.html',
        controller: 'HomeController',
        resolve: {
            homeInfo:  function() {
                return {
                    subtitle : 'Welcome to tables, ladders and chairs'
                };
            }
        }
    })

在我的 HomeController.js 中:

app.controller('HomeController', function($scope, srv1, srv2, homeInfo, $rootScope) {

    $rootScope.$broadcast('brdSubtitle', homeInfo.subtitle);

});

我的测试:

describe('HomeController', function () {

    var $rootScope, $scope, $controller, homeController;

    beforeEach(module('myApp'));

    beforeEach(inject(function (_$rootScope_, _$controller_) {
        $rootScope = _$rootScope_;
        $scope = $rootScope.$new();
        $controller = _$controller_;

        homeController = $controller('HomeController', {'$rootScope': $rootScope, '$scope': $scope, homeInfo: { subtitle : 'Welcome to tables, ladders and chairs' }});
    }));

    it('should exist', function() {
        expect(homeController).toBeDefined();
    });

    it('should have a subtitle', function() {
        expect(homeController.homeInfo.subtitle.text()).toBe('Welcome to tables, ladders and chairs');
    });
});

错误是:

TypeError: homeController.homeInfo is undefined in /path/to/specs.js

【问题讨论】:

    标签: javascript angularjs jasmine karma-jasmine jasmine-jquery


    【解决方案1】:

    您应该尝试在beforeEach 中模拟服务值,因为显然将值放在$controller 参数中不起作用。

    beforeEach(module(function($provide) {
        $provide.value('homeInfo', {
            subtitle : 'Welcome to tables, ladders and chairs'
        });
    }));
    

    【讨论】:

      【解决方案2】:

      没错,你没有在控制器中做this.homeInfo = homeInfo;,在这种情况下homeController.homeInfo应该是未定义的。

      没有理由应该测试模拟的 homeInfo 本地依赖项。改为测试控制器中发生的情况:

      beforeEach(inject(function (_$rootScope_, _$controller_) {
          ...
      
          brdSubtitleListener = jasmine.createSpy('brdSubtitleListener');
          $scope.$on('brdSubtitle', brdSubtitleListener);
      
          homeController = $controller('HomeController', {'$rootScope': $rootScope, '$scope': $scope, homeInfo: { subtitle : 'Welcome to tables, ladders and chairs' }});
      }));
      
      
      it('should broadcast a subtitle', function() {           
        expect(brdSubtitleListener).toHaveBeenCalledWith(jasmine.any(Object), 'Welcome to tables, ladders and chairs');
      
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-09
        • 2015-12-13
        • 1970-01-01
        • 2017-09-27
        相关资源
        最近更新 更多