你可以使用实习生在测试中进行测试吗?

时间:2015-12-02 23:56:26

标签: javascript functional-testing intern

为了证明我的问题,这里过分简化了我想要做的事情:

我有两个功能测试:loginlogout。我创建了一个UI,允许用户(读取:其他开发人员)在给定的浏览器上选择和运行给定的测试。

如果logout没有先运行,login将会失败,这很明显。为了解决这个问题,我在loggedIn测试中设置了一个全局变量login,并将以下设置功能添加到我的logout测试中:

setup: function() {
    if (!globals.get('loggedIn')) {
        return require('./login')();
    }
},

这在require语句处失败,并显示以下错误消息:

SUITE ERROR
Error: Attempt to require unloaded module tests/functional/login

如何使我的设置功能运行login测试,而不将测试复制粘贴到我的每个测试文件中?

修改

完整的测试套件:

login.js

define([
    'intern!object',
    'intern/chai!assert',
    '../../var/globals'
], function(registerSuite, assert, globals) {
    registerSuite({
        name: 'logout',
        'logout': function() {
            return this.remote
                .get('www.example.com/login')
                .findById('status')
                    .getVisibleText()
                .then(function(text) {
                    var loggedIn = text === 'logged-in';
                    if (loggedIn) globals.set('loggedIn', true);
                    assert.equal(loggedIn, true);
                });
        }
    });
});

logout.js

define([
    'intern!object',
    'intern/chai!assert',
    'require',
    '../../var/globals'
], function(registerSuite, assert, require, globals) {
    registerSuite({
        name: 'logout',
        setup: function() {
            if (!globals.get('loggedIn')) {
                return require('./login')();
            }
        },
        'logout': function() {
            return this.remote
                .get('www.example.com/logout')
                .findById('status')
                    .getVisibleText()
                .then(function(text) {
                    assert.equal(text, 'logged-out');
                });
        }
    });
});

all.js

define([
    './login.js',
    './logout.js'
    // other tests that also depend on login.js
], function() {});

我想运行logout测试以运行login,并运行all测试以运行login测试一次,无论有多少其他测试取决于login

1 个答案:

答案 0 :(得分:0)

编辑:问题是由require同步造成的。使用define中使用的依赖关系数组加载模块只会运行一次测试。这意味着您只需将任何测试添加为依赖项,而无需更改任何测试组(例如我的all测试)。

这会将我的模块更改为以下内容:

login.js

define([
    'intern!object',
    'intern/chai!assert',
    // globals var removed
], function(registerSuite, assert) {
    registerSuite({
        name: 'logout',
        'logout': function() {
            return this.remote
                .get('www.example.com/login')
                .findById('status')
                    .getVisibleText()
                .then(function(text) {
                    assert.equal(text, 'logged-in');
                });
        }
    });
});

logout.js

define([
    'intern!object',
    'intern/chai!assert',
    // require removed
    // globals var removed
    './login' // login module added
], function(registerSuite, assert) {
    registerSuite({
        name: 'logout',
        // setup method removed
        'logout': function() {
            return this.remote
                .get('www.example.com/logout')
                .findById('status')
                    .getVisibleText()
                .then(function(text) {
                    assert.equal(text, 'logged-out');
                });
        }
    });
});

all.js(保持不变)

define([
    './login.js',
    './logout.js'
    // other tests that also depend on login.js
], function() {});