1
votes

Impossible de passer deux paramètres comme argument à la fonction Javascript

J'essaye d'utiliser karate.call pour appeler la fonction d'un fichier JS recevant deux arguments (String, Array of String). Cependant le tableau de chaînes ne serait pas transmis au fichier JS.

Le fichier JS contient:

TypeError: Cannot read property "length" from undefined

Et j'appelle la fonction JS sur un autre fichier JS dans ce manière:

//var query = 'Some string';
//var fragments = ['fragment1', 'fragment2'];
var clean = karate.call('../helper/helper.js', [query, fragments]);

Je suis capable de passer une requête qui est une chaîne. Mais je n'ai pas pu passer le tableau de chaîne. L'erreur dit:

function(query, fragments) {
// Here lies some code
// One of them includes fragments.length;
}

Il semble que le tableau de chaînes ne soit pas passé à la fonction JS. Toute aide sera fortement appréciée. Merci!


1 commentaires

Votre .call () ne transmet qu'un seul paramètre, ce tableau que vous créez à partir de query et de fragments . Si vous avez utilisé .apply () au lieu de .call () , cela aurait du sens.


5 Réponses :


1
votes

.call prend les paramètres sous forme de valeurs séparées par des virgules, vous devez utiliser .apply si vous souhaitez transmettre les valeurs sous forme de tableau.

var clean = karate.call('../helper/helper.js', query, fragments);

fonctionnera ...


1 commentaires

Cela ne fonctionne pas car le karaté se plaint que l'appel de la fonction javascript a échoué: TypeError: Impossible d'appeler la méthode [jdk.internal.dynalink.beans.OverloadedDynamicMethod Object com.intuit.karate.core.ScriptBridge.call (String, Object) Object com .intuit.karate.core.ScriptBridge.call (String)] avec les arguments passés; ils ne correspondent à aucune de ses signatures de méthode.



0
votes

La méthode

call accepte les paramètres séparés par des virgules et apply accepte le tableau, vous devez donc remplacer call par apply . votre code ressemble à

function karate(query, fragments) {
// Here lies some code
// One of them includes fragments.length;
}

var clean = karate.apply('../helper/helper.js', [query, fragments]);


3 commentaires

Je ne pense pas qu'il y ait eu une méthode de karate.apply (), car elle n'est pas disponible dans la documentation également. J'ai essayé votre recommandation et il est dit que karate.apply n'est pas une fonction github.com/ intuit / karaté


@Raymond veuillez donner un nom à la fonction, le code est mis à jour.


tout le monde: veuillez ignorer cette réponse, une fois que vous avez défini une fonction JS, vous pouvez y insérer des parenthèses et des arguments comme NORMAL JS. ce qui est pire, cet exemple redéfinit l'objet d'aide JS intégré karaté



0
votes
 var clean = karate.call('../helper/helper.js', query, fragments);
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call

1 commentaires

Cela ne fonctionne pas car le karaté se plaint que l'appel de la fonction javascript a échoué: TypeError: Impossible d'appeler la méthode [jdk.internal.dynalink.beans.OverloadedDynamicMethod Object com.intuit.karate.core.ScriptBridge.call (String, Object) Object com .intuit.karate.core.ScriptBridge.call (String)] avec les arguments passés; ils ne correspondent à aucune de ses signatures de méthode.



2
votes

Vous pouvez lire votre fonction en premier et l'invoquer est comme n'importe quelle autre fonction js

 var myCall = karate.read('../helper/helper.js')(query, fragments);

ou

var myFun = karate.read('../helper/helper.js');
var funCall = myFun(query, fragments);

cela devrait fonctionner.


0 commentaires

1
votes

Les réponses ici manquent une clarification importante:

Je fais souvent des fonctions d'argument unique comme:

* def params = concatParams('01/01/2020', '3433344')

Et j'appellerai cela comme ceci:

* def params = call concatParams {date: '01/01/2020', caseid: '3433344'}
* def params = call concatParams '01/01/2020' '3433344'

Mais, quand je veux faire 2 paramètres, je vais définir une fonction comme ceci:

* def concatParams =
  """
  function(d,s) {
    return "urldt=" + d.date + "&caseid=" + s.caseid
  } 
  """

Et de manière non intuitive, ni l'un ni l'autre fonctionnera:

* def params = call concatParams {caseid: '3433344'}

Pour le faire fonctionner, je l'appelle plutôt comme ceci:

* def concatParams =
  """
  function(s) {
    return "urldt=" + todaysDate + "&caseid=" + s.caseid
  } 
  """

La documentation ne clarifie pas ceci.


2 commentaires

Vous avez tort. la documentation clarifie ceci: github.com/intuit/karate#javascript-functions


Uhm. Votre cas est différent de celui que j'ai demandé ici.Comme Peter l'a dit, je n'ai aucun problème à passer des paramètres comme les fonctions JS normales quand il est déclaré dans une fonctionnalité