【发布时间】:2014-03-19 20:08:25
【问题描述】:
我目前正在尝试为现有代码块编写测试,但遇到了一个内部有嵌套 ng-grid 的控制器的问题。问题来自控制器试图在初始化时与网格交互。
测试软件
节点@0.10.14
业力@0.10.2
业力茉莉@0.1.5
karma-chrome-launcher@0.1.2
我的测试:
define(["angularjs", "angular-mocks", "jquery",
"js/3.0/report.app",
"js/3.0/report.controller",
"js/3.0/report.columns"
],
function(angular, ngMocks, jquery, oARModule, oARCtrl, ARColumns) {
"use strict";
describe("Report Center Unit Tests", function() {
var oModule;
beforeEach(function() {
oModule = angular.module("advertiser_report");
module("advertiser_report");
});
it("Advertiser Report Module should be registered", function() {
expect(oModule).not.toBeNull();
});
describe("Advertiser Report Controller", function() {
var oCtrl, scope;
beforeEach(inject(function($rootScope, $controller, $compile) {
var el = document.createElement('div');
el.setAttribute('ng-grid','gridOptions');
el.className = 'gridStyle';
scope = $rootScope.$new();
$compile(el)(scope);
oCtrl = $controller('ARController', {
$scope: scope
});
}));
it("Advertiser Report controller should be registered", function() {
expect(oCtrl).not.toBeNull();
});
});
});
});
您将看到我尝试在哪里创建和编译具有 ng-grid 属性的元素。如果不这样做,我会收到以下错误:
TypeError: 无法读取未定义的属性“列”
这是控制器尝试调用类似
的结果
$scope.gridOptions.$gridScope.columns.each
所以我添加了一个带有ng-grid属性的div的创建,得到了一个新的错误:
TypeError: 无法设置未定义的属性“gridDim”
所以,我尝试在 $controller 调用之前添加 scope.gridOptions,但这让我回到了最初的错误。我一直在寻找在不重写控制器和/或模板的情况下完成这项工作的方法,因为它们目前在生产中正常工作。
【问题讨论】:
-
您是否尝试过在编译网格之前注入控制器?如果网格依赖于控制器范围内的东西,那么控制器必须有机会在网格尝试访问它之前将所有这些东西放在范围内,这对我来说是有意义的。
-
网格不访问控制器,反之亦然。这就是我试图模拟这种依赖关系的原因。
-
网格访问控制器定义的'gridOptions'范围属性,对吗?
-
对,如果您阅读了我的问题的结尾,您会注意到我尝试将 gridOptions 添加到 scope 属性,这让我回到了原来的错误。
-
看看这个 plunker:plnkr.co/edit/uTC1d0?p=preview 它有一个工作规范和一个失败的规范。唯一的区别是控制器被实例化的顺序。如果它在网格编译之前完成,它会起作用,因为控制器有机会在网格尝试在 $compile 期间访问它们之前定义范围属性。
标签: angularjs unit-testing ng-grid