2015-07-19 82 views
1

我需要一些帮助,在量角器中嵌套for循环和正确转换/理解promise。在下面的“测试”中,该功能适用​​于所有值,但只要我尝试将嵌套for循环放到南方,有人对此有任何清楚的建议吗?我已经尝试了forEach,它表明了固有地处理承诺问题,但我似乎得到了相同的结果。量角器嵌套for循环

我的测试数据是这样的:

objectPage.chartValues = { 
[['chart','ChartID01'],['title','TitleText01'],['Name01','value01'],['Name02','Value02']], 
[[‘chart','ChartID02'],['title','TitleText02'],['Name01','value01'],['Name02','Value02']], 
[[‘chart','ChartID03'],['title','TitleText03'],['Name01','value01'], [‘Name02’,'Value02'],['Name03','Value03']] 
} 

it ('test', function(){ 

    for (chartNumber = 0; chartNumber < objectPage.chartValues.length; chartNumber++) { 
     for (chartEntry = 1; chartEntry < ObjectPage.chartValues[chartNumber].length; chartEntry++) { 

    //for readability of next call pulled out here 
      chart = objectPage.chartValues[chartNumber][0][1]; 
      name = objectPage.chartValues[chartNumber][chartEntry][0]; 
      value = objectPage.chartValues[chartNumber][chartEntry][1]; 

      pageObject.getbackgroundcolor(chart, name).then(function (color) { 
       expect(pageObject.getElementFromTable(chart, name, color).getText()) 
        .toEqual(value); 

      }); 
     } 
    } 
}); 

//function calls in pageobject the call for get background is straight forward. 

    this.getbackgroundcolor = function (chartName, valueName) { 
      return element(by.id(chartName)).element(by.cssContainingText('.dxc-item', valueName)).element(by.tagName('rect')).getAttribute('fill'); 

//get element is very similar. 
    this.getElementFromTable = function(chartName, valueName, colorname) { 
    some searching stuff.. 
    return element(by.css(‘tspan')); 

我的结果似乎表明一下执行,而不是从实际返回的期望。最后试图找到背景颜色为null的项目的值。我知道这是不正确的,因为我已经单独运行所有的值,并且顺序没有问题。希望我避免切割和过去/泛化错误。

谢谢。

更新: 它( '验证页面上的图表',函数(){

myChartlength = objectPage.chartValues.length; 

    for (chartNumber = 0; chartNumber < myChartlength; chartNumber++) { 
     (function (chartNumber) { 

      myEntrylength = objectPage.chartValues[chartNumber].length;   
      chartValues = objectPage.chartValues[chartNumber]; 

      for (chartEntry = 2; chartEntry < myEntrylength; chartEntry++) { 
       (function (chartEntry) { 

        //pulled these out for readablility of next call. 
        chart = chartValues[0][1]; 
        name = chartValues[chartEntry][0]; 
        value = chartValues[chartEntry][1]; 
        console.log('chart: ' + chart + ', name: ' + name + ', value: ' + value); 

        page.getbackgroundcolor(chart, name).then(function (color) { 
         expect(objectPage.getElementFromTable(chart, name, color).getText()).toEqual(value); 
        }); 
       })(chartEntry); 
      }; 
     })(chartNumber); 
    }; 

});

+0

你应该重新格式化你的问题 - 代码应该被格式化为代码。使用'code'按钮:] – FuzzyAmi

+1

听起来像[闭环内部的JavaScript闭包 - 简单实用示例]的副本(http://stackoverflow.com/questions/750486/javascript-closure-inside-loops-simple-practical-example ) 对我来说。如果没有,请先解决。 – Bergi

回答

3

简单的例子是啊,如果我理解正确你的问题,你的问题是异步。它在任何承诺返回之前通过循环发射。

要循环测试,我发现的最佳解决方案是使用IIFEInstantly Invoked Function Expression)。其中,你创建你的循环,创建iife,并传入索引。

这里有一个基本的例子:

describe('to loop tests', function() { 
    var data = ['1', '2', '3']; 

    for(var i = 0; i < data.length; i++) { 
     // create your iife 
     (function(i) { 

      it('pass in the index to an iife', function() { 
       console.log('i is: ' + i); 
       expect(data[i]).toBe(true); 
      }); 

     })(i); // pass in index 
    } 
}); 

这个伟大的工程为数据驱动比如从一个数据文件,或任何测试。如果你需要多个循环,就像你的示例代码一样,你只需要创建多个循环。

+0

这对我有效。我会将编辑的代码添加到原始问题中,因为评论太长。谢谢。 – alwayslearning

+0

很高兴为您工作。你应该把这个标记为答案,让其他人知道同一个问题...... – Brine

+0

你会怎么做这样的事情? – alwayslearning

1

你不应该用量角器for循环,否则你的时间就会不合适。 由于量角器的异步性质,如果您需要环路,我会将async's maphttps://github.com/caolan/async看作一个很好且干净的解决方案。

另一种选择是使用ES5的map当你需要在量角器环路,如:

[1,3,5,7].map(function(index,key){ 
    expect(element.all(by.css('.pages-list')).get(index).isDisplayed()).toBeFalsy() 
}) 

在你的情况,我看你需要一个for loops生产数组,稍后可以映射在它。

您可以使用此函数的数组,它使用里面的for loops并返回所需的数组回调。 一个for loop

function returnIndexes(callback){ 
var exitArray = []; 
for (var i = 0; i < someArray.length; i++) { 
    if(someArray[i].length > 12){ 
     exitArray.push(someArray[i]); 
    } 

    if(i==someArray.length-1){ 
    callback(exitArray); 
    } 
}