Angular Jasmine 测试中未定义 $watchGroup 和 $watch

Angular $watchGroup and $watch undefined in Jasmine tests

谁说测试 Angular 应用程序是一件轻而易举的事,那一定是在开玩笑。自从我开始为我们的 Angular 应用程序编写测试以来,当我在 运行 因果报应时从一条错误消息转移到另一条错误消息时,我认为这是一个巨大的成功。大多数在线示例似乎都经过了简化,并不能真正转移到我的错误案例中。现在,谈谈我目前遇到的问题:

我在 karma.conf.js 文件中连接了 angular-mocks.js 和其他 angular 依赖项,我已经测试了我们应用程序的配置块(控制器和模板匹配路由) 并且测试是绿色的。现在我正在尝试测试具有 $watchGroup 的控制器 - 由于某些血腥原因 $watchGroup 在我的茉莉花测试中未定义(并且当我尝试使用它时也是 $watch )。当我将 $watchGroup 注释掉时,我的虚拟测试 expect(true).toBe(true) 是绿色的,但是控制器中的 $watchGroup 代码(顺便说一句,它工作正常)karma 控制台报告 $watchGroup 未定义。

这是控制器中的代码:

$scope.$watchGroup([
  'Message.AgeRangeMin',
  'Message.AgeRangeMax',
  'Message.SubscriberListFileId',
  'Message.SmsSettings.SelectedSender',
  'Message.EmailSettings.SelectedTemplate',
  'Message.PushSettings.SelectedSenders.length',
  'Message.SocialSettings.SelectedSocialNetworks.length'
  ], $scope.triggerUserForecast
);

$scope.triggerUserForecast = function () {
  commsMgmtHttpService.GetTotalReach($scope.Message)
    .then(function (data) {
      $scope.UserDeliveryForecast = data;
    }, function () {
      $scope.UserDeliveryForecast.TotalUserReach = 0;
    });
};

这是我的测试用例:

describe('forge.communications.CommsApp', function () {

  beforeEach(module('forge.communications.CommsApp'));

  describe('CreateScheduledMessageController', function () {

    var ctrl, $scope, $rootScope, $controller, $httpBackend;

    beforeEach(function () {

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

            $controller = _$controller_('CreateScheduledMessageController', {
                $scope: $scope,

                $scope: {
                    ModelState: new ModelState($scope)
                },

                $location: $location,
                $modal: $modal,
                $upload: $upload
            });
        })
    });

    it("dummy should be true", function () {
        expect(true).toBe(true);
    });
  });
});

这是我收到的 Karma 控制台错误:

Chrome 40.0.2214 (Windows 7) forge.communications.CommsApp CreateScheduledMessageController dummy 应该定义失败 TypeError: undefined is not a function at new (C:/work/theforge/src/TheForge/dist/CommsApp. js:2581:12) 在调用 (C:/work/theforge/src/TheForge/Scripts/angular.js:4118:17) 在 Object.instantiate (C:/work/theforge/src/TheForge/Scripts/angular.js:4129:23) 在 C:/work/theforge/src/TheForge/Scripts/angular.js:8320:28 在对象。 (C:/work/theforge/src/TheForge/FrontEndTests/CommsAppTests/unit/Controllers/CreateScheduledMessage/CreateScheduledMessageController.spec.js:31:31) 在 Object.invoke (C:/work/theforge/src/TheForge/Scripts/angular.js:4118:17) 在 Object.workFn (C:/work/theforge/src/TheForge/Scripts/angular-mocks.js:2257:20) 在 window.inject.angular.mock.inject (C:/work/theforge/src/TheForge/Scripts/angular-mocks.js:2229:37) 在对象。 (C:/work/theforge/src/TheForge/FrontEndTests/CommsAppTests/unit/Controllers/CreateScheduledMessage/CreateScheduledMessageController.spec.js:22:13) 错误:声明位置在 window.inject.angular.mock.inject (C:/work/theforge/src/TheForge/Scripts/angular-mocks.js:2228:25)at Object . (C:/work/theforge/src/TheForge/FrontEndTests/CommsAppTests/unit/Controllers/CreateScheduledMessage/CreateScheduledMessageController.spec.js:22:13) Chrome 40.0.2214 (Windows 7): 执行了 15 次中的 15 次 (1 次失败) (0 秒/0.12 秒) WARN [web-server]: 404: /forge/signalr/negotiate?clientProtocol=1.4&connectionDaChrome 40.0.2214 (Windows 7): 执行 15 of 15 (1 FAILED) (0.415 secs / 0.12秒)

任何建议都会对我有很大帮助。

谢谢。

看来我在 jasmine 测试中覆盖了 $controller 的 $scope 属性。按照@Chandermani 的建议删除以下代码行解决了我的问题。

$scope: {
  ModelState: new ModelState($scope)
}