javascript - 将 require 与相对路径一起使用

标签 javascript angularjs testing protractor

我们对 Protractor 进行了大量的端到端测试。我们遵循页面对象模式,这有助于我们保持测试干净和模块化。我们还有一组辅助函数,可以帮助我们遵循 DRY principle .

问题:

单个规范可能需要多个页面对象和辅助模块。例如:

"use strict";

var helpers = require("./../../helpers/helpers.js");
var localStoragePage = require("./../../helpers/localStorage.js");
var sessionStoragePage = require("./../../helpers/sessionStorage.js");

var loginPage = require("./../../po/login.po.js");
var headerPage = require("./../../po/header.po.js");
var queuePage = require("./../../po/queue.po.js");

describe("Login functionality", function () {

    beforeEach(function () {
        browser.get("/#login");

        localStoragePage.clear();
    });

    // ...

});

你可以看到我们在每个 require 语句中都有那个目录遍历:./../..。这是因为我们有一个 specs 目录,我们将 specs 和多个目录保存在按被测应用程序功能分组的目录中。

问题:

解决 Protractor 中相对路径问题的规范方法是什么?

换句话说,我们希望避免遍历树,向上导入模块。从基本应用程序目录向下走会更干净。


尝试与思考:

关于解决这个问题有一篇很棒的文章:Better local require() paths for Node.js ,但我不确定在使用 Protractor 开发测试时推荐使用哪个选项。

我们还尝试使用 require.main构建路径,但它指向 node_modules/protractor 目录而不是我们的应用程序目录。

最佳答案

我遇到了同样的问题,最后得到了以下解决方案。 在我的 Protractor 配置文件中,我有一个变量,它存储我的 e2e 测试的基本文件夹的路径。此外,Protractor 配置提供了 onPrepare回调,您可以在其中使用名为 global 的变量来为您的测试创建全局变量。您将它们定义为该 global 变量的属性,并使用与在测试中使用全局变量 browserelement 相同的方式。我用它来创建自定义全局 require 函数来加载不同类型的实体:

// __dirname retuns a path of this particular config file
// assuming that protractor.conf.js is in the root of the project
var basePath = __dirname + '/test/e2e/';
// /path/to/project/test/e2e/

exports.config = {

    onPrepare: function () {

        // "relativePath" - path, relative to "basePath" variable

        // If your entity files have suffixes - you can also keep them here
        // not to mention them in test files every time

        global.requirePO = function (relativePath) {
            return require(basePath + 'po/' + relativePath + '.po.js');
        };

        global.requireHelper = function (relativePath) {
            return require(basePath + 'helpers/' + relativePath + '.js');
        };

    }

};

然后您可以立即在测试文件中使用这些全局实用程序方法:

"use strict";    

var localStorageHelper = requireHelper('localStorage');
// /path/to/project/test/e2e/helpers/localStorage.js 

var loginPage = requirePO('login');
// /path/to/project/test/e2e/po/login.po.js

var productShowPage = requirePO('product/show');
// /path/to/project/test/e2e/po/product/show.po.js


describe("Login functionality", function () {

    beforeEach(function () {
        browser.get("/#login");

        localStorageHelper.clear();
    });

    // ...

});

关于javascript - 将 require 与相对路径一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31491952/

相关文章:

javascript - 从javascript中括号之间的多个数组循环

javascript - openweathermap API 到 Angular ES6

testing - 功能无法访问 Rspec 帮助程序方法

javascript - Jquery:在检查最后一个字母时将文本从表单复制到 DIV

javascript - 轻量级 jQuery(或非 jQuery) slider 控件?

javascript - 更新 AngularJS 服务中的 radio 值

javascript - 通过 $http 检索数组并在 ion-list 的 ion-item 中查看

php - 调试 Zend Framework 1 测试失败

Android UI 测试无法解析 : Intent 的 Activity

javascript - (function() {/*...*/}).call(this); 的优势