Câu hỏi Sử dụng yêu cầu với đường dẫn tương đối


Chúng tôi có một tập hợp khá lớn các bài kiểm tra từ đầu đến cuối trên Thước đo góc. Chúng tôi đang tuân theo mẫu Đối tượng trang giúp chúng tôi giữ cho các thử nghiệm của mình luôn sạch sẽ và mô-đun. Chúng tôi cũng có một bộ chức năng trợ giúp giúp chúng tôi theo dõi Nguyên tắc DRY.

Vấn đề: 

Một spec duy nhất có thể yêu cầu nhiều đối tượng trang và mô-đun trợ giúp. Ví dụ:

"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();
    });

    // ...

});

Bạn có thể thấy rằng chúng ta có traversal thư mục trong mỗi câu lệnh require: ./../... Điều này là bởi vì chúng tôi có một specs thư mục nơi chúng tôi giữ các thông số kỹ thuật và nhiều thư mục bên trong được nhóm theo chức năng ứng dụng trong thử nghiệm.

Câu hỏi:

Cách kinh điển để tiếp cận vấn đề đường dẫn tương đối trong thước đo góc là gì?

Nói cách khác, chúng tôi muốn tránh đi qua cây, đi lên để nhập mô-đun. Nó sẽ được sạch hơn nhiều để đi xuống từ thư mục ứng dụng cơ sở để thay thế.


Nỗ lực và suy nghĩ:

Có một bài viết tuyệt vời về việc tiếp cận vấn đề này: Đường dẫn require () tốt hơn cho Node.js, nhưng tôi không chắc chắn tùy chọn nào là tùy chọn được đề xuất khi phát triển các thử nghiệm với Thước đo góc.

Chúng tôi cũng đã cố gắng sử dụng require.main để xây dựng đường dẫn, nhưng nó trỏ đến node_modules/protractor thay vì thư mục ứng dụng của chúng tôi.


47
2017-07-18 14:03


gốc




Các câu trả lời:


Tôi đã có cùng một vấn đề và tôi đã kết thúc với các giải pháp sau đây. trong tôi Thước đo góc config file Tôi có một biến lưu trữ một đường dẫn đến một thư mục cơ sở của các bài kiểm tra e2e của tôi. Cũng thế, Thước đo góc config cung cấp onPrepare gọi lại, nơi bạn có thể sử dụng biến được gọi global để tạo các biến toàn cầu cho các thử nghiệm của bạn. Bạn xác định chúng như là một thuộc tính của điều đó global biến và sử dụng cùng cách bạn sử dụng hình cầu browser hoặc là element trong các thử nghiệm. Tôi đã sử dụng nó để tạo các hàm yêu cầu toàn cầu tùy chỉnh để tải các loại thực thể khác nhau:

// __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');
        };

    }

};

Và sau đó bạn có thể sử dụng các phương pháp tiện ích toàn cầu này trong tệp thử nghiệm của mình ngay lập tức:

"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();
    });

    // ...

});

24
2017-07-18 21:22





Chúng tôi đã phải đối mặt với cùng một vấn đề và quyết định biến tất cả các đối tượng trang và các tệp trợ giúp thành các gói nút. Yêu cầu chúng trong các bài kiểm tra bây giờ dễ dàng như var Header = require('header-po'). Một lợi ích khác của việc chuyển đổi thành các gói là bạn có thể sử dụng phiên bản thích hợp.

Đây là một ví dụ đơn giản:

./page-objects/header-po/index.js

//page-objects/header-po/index.js

'use strict';

var Header = function () {
    this.goHome = function () {
        $('#logo a').click();
    };
  };

module.exports = Header;

./page-objects/header-po/package.json

{
    "name": "header-po",
    "version": "0.1.1",
    "description": "Header page object",
    "main": "index.js",
    "dependencies": {}
}

./package.json

{
    "name": "e2e-test-framework",
    "version": "0.1.0",
    "description": "Test framework",
    "dependencies": {
        "jasmine": "^2.1.1",
        "header-po": "./page-objects/header-po/",
    }
}

./tests/header-test.js

'use strict';

var Header = require('header-po');

var header = new Header();

describe('Header Test', function () {
    it('clicking logo in header bar should open homepage', function () {
        browser.get(browser.baseUrl + '/testpage');
        header.goHome();
        expect(browser.getCurrentUrl()).toBe(browser.baseUrl);
    });
});

17
2017-07-25 08:17





Tôi cũng từng gặp vấn đề tương tự. Đã làm giải pháp tương tự như Michael Radionov, nhưng không thiết lập một chức năng toàn cầu, nhưng thiết lập một tài sản để thước đo chính nó.

protractor.conf.js

onPrepare: function() {
  protractor.basePath = __dirname;
}

test-e2e.js

require(protractor.basePath+'/helpers.js');

describe('test', function() {
   .......
});

10
2017-07-21 04:07





Tôi nghĩ rằng phương pháp chúng tôi sử dụng nơi tôi làm việc có thể là một giải pháp tốt cho bạn. Tôi đã đăng một ví dụ ngắn gọn về cách chúng tôi xử lý mọi thứ. Nó khá tốt đẹp b / c bạn chỉ có thể gọi các chức năng đối tượng trang trong bất kỳ tập tin spec và bạn không cần phải sử dụng yêu cầu trong spec.

Gọi mô-đun nút từ mô-đun khác mà không cần sử dụng require () ở mọi nơi


2
2017-07-24 20:56