【问题标题】:Angular $watchGroup and $watch undefined in Jasmine testsJasmine 测试中未定义 Angular $watchGroup 和 $watch
【发布时间】:2015-01-29 15:00:59
【问题描述】:

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

我在 karma.conf.js 文件中连接了 angular-mocks.js 和其他角度依赖项,我已经测试了我们应用程序的配置块(控制器和模板匹配路由)并且测试是绿色的。现在我正在尝试测试具有 $watchGroup 的控制器 - 出于某种血腥的原因,在我的 jasmine 测试中 $watchGroup 是未定义的(当我尝试使用它时也是 $watch)。当我将 $watchGroup 注释掉时,我的虚拟测试 expect(true).toBe(true) 是绿色的,但控制器中有 $watchGroup 代码(顺便说一句,它工作正常)业力控制台报告 $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 应该被定义 FAILED 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 在 Object. (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) 在 Object. (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) 在对象。 (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): Executed 15 of 15 (1 FAILED) (0.415 secs / 0.12 secs)

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

谢谢。

【问题讨论】:

  • 我在创建控制器时看到了两次 $scope?是不是笔误?
  • 不,$scope:控制器内部的 $scope 意味着左侧的 $scope - 控制器上的一个属性被分配和注入 $scope 在上面几行定义($scope = $rootScope.$new( ))。您基本上是将注入的 $rootScope 创建的 $scope 传递给控制器​​。
  • 我对这两个声明一个接一个,` $scope: ..., $scope: { ModelState: new ModelState($scope) },`
  • 你是绝对正确的,因为我遇到了另一个错误,所以我把这个声明放进去,但是从那以后我简化了我的代码并被困在 $watchGroup 未定义的问题上,完全忽略了我在我的 Jasmine 测试中有效地覆盖了 $coontroller 中的 $scope 对象。删除 $scope: {ModelState: new ModelState($scope)} 解决了这个问题。
  • 投票结束,因为这是题外话,本质上是寻求调试帮助。

标签: angularjs karma-jasmine


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-29
    • 1970-01-01
    • 2015-02-10
    • 2023-03-12
    • 1970-01-01
    • 2020-11-20
    • 2016-03-07
    相关资源
    最近更新 更多