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)
}
谁说测试 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)
}