我的测试在我正在测试的应用中创建了一个新条目。测试插入一个包含时间戳的注释,以便我以后可以识别它。
在运行测试的页面上,显示数据库中所有条目的列表,每个条目旁边都有一个按钮。测试应该获得转发器,测试任务是否在那里,导航到它并单击正确的按钮。
我可以导航到该任务并单击按钮,但我对如何测试测试条目是否存在感到困惑。
it('should start a tasks', function() {
repeater = by.repeater('task in taskList');
tasks = element.all( repeater );
expect( tasks.count() ).not.toBe(0);
// ???
// the missing piece would go here
// = Check if the list contains a task with the time stamped comment
// Now in detail we single out the task an click its button to
// perform additional tests
tasks.map( function(elmnt, indx){
description = elmnt.findElement( by.className('taskDescription') );
description.getText().then( function(text){
if ( text.indexOf( timeStampedComment ) > -1 ) {
console.log("Found the test entry!");
// click the button *(1)
// some expectation
};
});
});
});
如果测试永远不会到达*(1)它会成功通过,所以我需要测试它是否到达那里或者是否有合适的条目。由于复杂的承诺结构,我不确定如何做到这一点。
我如何知道测试是否有效? (我可能在这里有一个大脑结,解决方案很明显)
编辑:我更新了plnkr以实际包含测试。如果您注释掉测试条目,您可以看到测试成功。
答案 0 :(得分:2)
我是Protractor的新手,但做了类似这样的事情,为我解决了这个问题:
it('should have Juri in the list', function(){
var data = element.all(by.repeater('person in people').column('person.name'));
data.getText().then(function(text){
expect(text).toContain('Juri');
});
});
甚至更短的形式
it('should have Juri in the list', function(){
var data = element.all(by.repeater('person in people').column('person.name'));
expect(data.getText()).toContain('Juri');
});
(注意,在这种情况下,Protractor.expect会为您处理承诺)
答案 1 :(得分:1)
如果我理解。您希望测试列表中是否存在满足某些条件的项目,如果找不到,则会失败。您可以使用返回值map
和toContain
:
var hasComment = tasks.map(function(task, index) {
var description = task.findElement(by.className('taskDescription'));
return description.getText().then(function(text) {
var hasTimeStamp = (text.indexOf(timeStampedComment) > -1);
return hasTimeStamp;
});
});
expect(hasComment).toContain(true);
注意return
语句。这些是使promise hasComment
的已解析值成为布尔测试数组的关键,每个测试都是时间戳测试的结果。