2016-07-29 1 views
0

Je souhaite pouvoir définir une variable, puis utiliser cette variable dans la méthode respond() dans la fonction module.run(). J'ai ce code dans mon il():Utilisation de variables dans la fonction mock httpBackend

var testValue=randomValue(); // suffice to say, a random value generator 
    var httpBackendMock = function() { 
     angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app']) 
      .run(function($httpBackend) { 
       $httpBackend.whenPOST(/.*\/api\/data/).respond(function(method, url, data, headers) { 
        return [200, '<?xml version="1.0" encoding="UTF-8" standalone="yes"?> \ 
        <data>'+testValue+'</data>', {}]; 
       }); 
.... 

Mais la variable testValue définie ci-dessus l'objet httpBackendMock n'est pas visible à l'intérieur de la fonction run() du tout, mais sera « non définie ». D'après ce que je comprends, les variables définies par 'var' dans JS sont disponibles pour le code à portée interne, mais ce n'est pas le cas ici. Y at-il un moyen d'obtenir des variables à l'intérieur?

+1

'httpBackendMock' est pas un objet. C'est une fonction. S'il vous plaît, montrez ce qui se passe avec. Si elle est exécutée avec 'browser.executeScript (httpBackendMock)', cela ne fonctionnera évidemment pas, car la portée de la fonction externe s'exécute dans le noeud et la portée de la fonction interne s'exécute dans le navigateur. – estus

+0

@estus Il provient de https://docs.angularjs.org/api/ngMockE2E/service/$httpBackend. Je l'ai tagué avec ngmocke2e parce que j'ai probablement besoin de gens qui connaissent ce framework. –

+0

Il n'y a aucune mention de la fonction 'httpBackendMock' dans le lien que vous avez posté. S'il vous plaît, montrez comment cette fonction est appelée. – estus

Répondre

0

La réponse est de transmettre un tableau imbriqué de valeurs et d'ajouter un argument à la signature de fonction de l'objet mockmodule.

var httpBackendMock = function(args) { 
    var isFoo=args[0]; 
    var isBar=args[1]; 
... 
browser.addMockModule('httpBackendMock', httpBackendMock, [['foo','bar']]); 

trouvé la réponse à: Protractor addMockModule additional arguments not working?

1

Ce morceau de code

var testValue=randomValue(); 

est exécuté dans le nœud. Et ce morceau de code

function() { 
    angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app']) 
    ... 
} 

est converti en chaîne, transmis au client et exécuté dans le navigateur.

champ de fonction extérieure n'est pas disponible en fonction interne, ce qui explique pourquoi testValue est undefined en fonction httpBackendMock, et il renvoie une erreur si la fonction httpBackendMock utilise le mode strict.

Des données supplémentaires peuvent être transmises via executeScript et addMockModule arguments supplémentaires, qui seront disponibles côté client. Comme indiqué in documentation, les arguments après les deux premiers sont transmis au navigateur.

Il devrait être quelque chose comme

var httpBackendMock = function(testValue) { 
    angular.module('httpBackendMock', ['ngMockE2E', 'name.of.app']) 
    ... 
} 
... 
var testValue=randomValue(); 
browser.addMockModule('httpBackendMock', httpBackendMock, testValue);