2015-07-25 2 views
5

Ich versuche, eine Anwendung zu testen, die Diagramme mit Rikscha und d3 zeigt. Tests werden mit Winkelmessern und Jasmin durchgeführt. Als eine Randnotiz glaube ich, dass die Frage für diesen Anwendungsfall nicht wirklich spezifisch ist und allgemeiner ist.Array von verschiedenen Werten des gleichen Elements mit Winkelmesser

so soll der Test eine Maus über ein Diagramm bewegen und den Text sammeln, der für jeden Punkt angezeigt wird (example). Dieses Array wird dann mit einem gegebenen Array verglichen.

ich dieses Pseudo-Code hoffen, zeigt das Problem:

var graph = ... // 
var promises = []; 
var promise = graphElement.getSize().then(function(size){ 
    _.times(size, function(i) { 
     moveMouse(i, 0); // move mouse to i-th pixel 
     promises.push(graph.element(by.css('.hover-text')).getText()); 
    }); 
    return promises; 
}); 

promise.magicallyWaitForAllOfThem(); 

_.each(promises, function(textPromise){ 
    expect(textPromise).toBe('something'); 
}); 

so ist das Problem, dass, da ich die Größe müssen zuerst lösen, ich habe nicht eine Möglichkeit haben, zu warten, bis alle Versprechen zu lösen und Rückkehr eine Reihe von Textversprechen, die später mit expect() verwendet werden können.

EDIT: explizit erwähnt Winkelmesser/Jasmin.

Antwort

3

können Sie nicht einfach Selen webdriver promise.all verwenden?

var graph = ... // 
var webdriver = require("selenium-webdriver"); 

graphElement.getSize().then(function(size){ 
    var promises = []; 
    _.times(size, function(i) { 
     moveMouse(i, 0); // move mouse to i-th pixel 
     promises.push(graph.element(by.css('.hover-text')).getText()); 
    }); 
    return webdriver.promise.all(promises); 
}).then(function(promiseResultArray){ 
    _.each(promiseResultArray, function(textPromise){ 
     expect(textPromise).toBe('something'); 
    }); 
}); 

sauberere Weg:

erklären sie:

collectHoverText: function(elem) { 
    var strings = []; 
    var promises = []; 

    return elem.getSize().then(function(size) { 
    _.times(0/*logic for number of steps*/, function(i) { 
     var x = 0; // logic for step 
     browser.actions().mouseMove(elem, {x: x, y: 0}).perform(); 
     promises.push(elem.element(by.css('.hover-text')).getText().then(function(text) { 
     strings.push(text); 
     })); 
    }); 

    return protractor.promise.all(promises).then(function() { 
     return _.uniq(strings); 
    }); 
    }); 

und es verwenden:

var hoverTextPromise = collectHoverText(graph); 
expect(hoverTextPromise).toContain('value'); // resolved array here 
+0

ist es anders aus protractor.promise.all? – ilj

+0

kann es ohne den Rückruf erreicht werden? – ilj

+0

du meinst ohne "dann"? Sie tun einen asynchronen Anruf, Sie benötigen einen Rückruf – mido