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!
5 Réponses :
.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 ...
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.
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]);
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é
var clean = karate.call('../helper/helper.js', query, fragments); https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/call
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.
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.
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.
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é
Votre
.call ()
ne transmet qu'un seul paramètre, ce tableau que vous créez à partir dequery
et defragments
. Si vous avez utilisé.apply ()
au lieu de.call ()
, cela aurait du sens.