使用Intern调用位于单独文件中的函数

时间:2014-10-26 23:06:35

标签: require intern

使用实习生,我有以下目录结构:

/intern
  /tests
    globals.js
    pageElements.js
    /functional
      /site1
        site1test1.js
      /site2
        site2test1.js
      /page_objects
        loginPage.js

我想要做的是将常用函数存储在page_objects目录中,用于各种页面,例如loginPage.js,并在实际测试中调用这些函数,例如site1test1.js等。我已经尝试了很多种方法,最新的基于此处发布的解决方案:Use helper modules for repeated, ordered tasks when functional testing in intern。通过这种方法,我发现" TypeError:对象#没有方法' setFindTimeout'"。我对实习生来说很新,对node.js来说很新,所以请原谅我的无知。我只想获得有关最佳方法的信息。

site1test1.js看起来像这样:

define([
    'intern!object',
    'intern/chai!assert',
    'require',
    'intern',
    'intern/dojo/node!../globals.js',
    'intern/dojo/node!./page_objects/loginPage.js'
], function (registerSuite, assert, require, intern, globals, loginPage) {

    registerSuite({
        name: 'index',

        'login': function () { 

            var current_env = intern.config.environment;
            var user = globals.getData(current_env).USER1;
            var url = globals.getData(current_env).url;

            return this.remote
                .get(url)
                .then(loginPage.login(user, globals.PASSWORD));

        }
    });
});

我的loginPage.js目前看起来像这样:

var pageElements = require('../../pageElements');
var globals = require('../../globals')

module.exports = {
    login: function(email, password) {
        return new this.constructor(this.session)
            .setFindTimeout(globals.TIMEOUT)
            .findById(pageElements.TEXTFIELD_ID_EMAIL)
            .click()
            .clearValue()
            .type(email)
            .end()
            .findById(pageElements.TEXTFIELD_ID_PASSWORD)
            .click()
            .clearValue()
            .type(password)
            .end()
            .findById(pageElements.BUTTON_ID_LOGIN)
            .click()
            .end()
    }
};

3 个答案:

答案 0 :(得分:0)

我能够通过AMD化loginPage模块解决问题,如下所示:

define([
    'intern!object',
    'intern/chai!assert',
    'require',
    'intern',
    '../../globals.js',
    '../../pageElements.js'
], function (loginPage,
             assert,
             require,
             intern,
             globals,
             pageElements) {

    var loginPage = {

        login : function (email, password) {

            return this
                .setFindTimeout(globals.TIMEOUT)
                .findById(pageElements.TEXTFIELD_ID_EMAIL).click()
                .clearValue()
                .type(email)
                .end()
                .findById(pageElements.TEXTFIELD_ID_PASSWORD).click()
                .clearValue()
                .type(password)
                .end()
                .findById(pageElements.BUTTON_ID_LOGIN).click()
                .end()
        }

    };
    return loginPage;

});

然后我可以在site1test1.js中调用它,如下所示:

return this.remote
           .get(url)
           .then(function(){ return loginPage.login.call(this, user, globals.PASSWORD); });

答案 1 :(得分:0)

我能够按照以下方式工作。 (根据tera_incognita的回答)

site1test1.js:

define([
  'intern!object',
  'intern/chai!assert',
  'intern/dojo/node!leadfoot/Command',
  'intern/dojo/node!leadfoot/lib/util',
  'require',
  'intern',
  '../page_objects/loginPage.js'
], function (registerSuite, assert, Command, util, require, intern, loginPage) {

registerSuite({
    name: 'index',

    'login': function () {
        var session = this.remote;
        var command = new Command(session);
        var current_env = intern.config.environment;
        var user = 'john_appleseed@apple.com';
        var url = 'http://localhost/hello.html';
        return command
           .get(url)
           .then(function(){ return loginPage.login(session, user, 'password1');});
    }
});
});

loginPage.js:

define([
  'intern!object',
  'intern/chai!assert',
  'require',
  'intern'      
], function (loginPage,
         assert,
         require,
         intern) {

var loginPage = {

    login : function (session, email, password) {

        return session
            .findById('email').click()
            .clearValue()
            .type(email)
            .end()
            .findById('password').click()
            .clearValue()
            .type(password)
            .end()
            .findById('login').click()
            .end()
    }

};
return loginPage;
});

hello.html的:

<html>
Hello!

<form>
  Email:<input id="email" type='text' name="email"><br>
  Password: <input id="password" type='text' name="password"><br>
  <input id="login" type="submit" value="Log in">
</form>    

</html>

答案 2 :(得分:0)

以下是我如何使用ES6(typescript)中的胖箭头函数来减少输入效果。

  return this.remote
        .then( () => { login(this.remote, 'admin', 'password'); })