Page 302 - AngularJS权威教程
P. 302
282 第 19 章 测试
19.23.1 测试列表
在<input>元素上建立测试之后,我们可以继续测试列表页的功能,如图19-13所示。
图19-13 测试列表页
既然剩下的待写测试都是在列表页中发生的,我们要把这里剩余的测试都嵌套在它们自己的
describe()块中。使用一个独立的块能让我们设置另外一个beforeEach()块,在里面我们会建
立针对angular/angular.js github仓库的测试。
这个describe块只会充当访问我们主页的用户,它在输入框中输入,然后按了回车。我们现
行的测试方式似乎有些多余,但是请记住,端对端测试的目的是自动化用户交互。
describe('listing page', function() {
beforeEach(function() {
element(by.input('repo.name')).sendKeys('angular/angular.js\n');
});
// ...
// 列表页测试会放在这里
});
列表页会有一些元素,通过ng-repeat迭代出来。使用GitHub API,会默认收到30个问题。
我们可以测试这个页面确实解析了30个问题。
可以使用.repeater()帮助函数来定位ng-repeat元素、这个帮助函数在页面上寻找
ng-repeat指令,并且找出匹配我们表达式的那一个。在这种情况下,我们是在使用Angular表达
式d in data | orderBy:created_at:false 。可以用这句来定位循环器:
by.repeater('d in data | orderBy:created_at:false')
我们可以显式设置过滤器(就像上面那样),或者是停止这个过滤器,使用更通用的:
by.repeater('d in data');
使用by.repeater()并未真的返回任何元素,只是得到了一个用于获取元素的方法的指
针。如果我们尝试对by.repeater()方法返回的对象设置期望,只会得到一个难看的错误。
Protractor这么做是因为元素是通过promise填入的,所以我们要使用element.all()函数来获取
解析后的元素。
var elems = element.all(by.repeater('d in data'));