【发布时间】: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)} 解决了这个问题。
-
投票结束,因为这是题外话,本质上是寻求调试帮助。