Knowledge Base Article

> Knowledge Base > Rapise

Created By  dmarkovtsev Thursday, March 2, 2017

Sometimes it is convenient to store function names in strings and use those strings to call actual functions. The article describes two ways of how you can do this in Rapise.

Imagine your tests are driven by a spreadsheet and some columns in the spreadsheet contain names of scenario functions you want to execute in your tests. How to invoke a function if its name is stored in a variable?

There are two major ways of doing this.

Method 1 (quick and dirty)

So you have something like this:

function fnLogin(userName, password)
{
	Tester.Message("User: " + userName);
	Tester.Message("Pass: " + password);
}

function fnLogout()
{
	Tester.Message("Logged out");
}

var strfn = "fnLogin";

What is next? Using the below code will not work:

strfn(); // throws error

One option is to use 'eval':

eval(strfn + "('user1', 'pwd1')");
//or
eval("fnLogout()");

Notice that you need to construct a whole string representing a function call, including parameter passing.

Method 2 (recommended)

This method requires a bit more time to setup but is more secure, faster and easier to use.

/*
 * Setup
 */

// create context object
var context = {};

// assign functions to the object
context["fnLogin"] = fnLogin;
context["fnLogout"] = fnLogout;

// this is the method performing execution of functions
function execFn(fnName, ctx /*, args */) 
{
  // get passed arguments except first two (fnName, ctx)
  var args = Array.prototype.slice.call(arguments, 2);
  // execute the function with passed parameters and return result
  return ctx[fnName].apply(ctx, args);
}


/*
 * Usage
 */

execFn(strfn, context, "user2", "pwd2");
execFn("fnLogout", context);

 

Article Info
  • Last Updated: 3/2/2017
  • Article ID: KB242
  • Views: 487