В JavaScript есть ли способ создать одну переменную для совместного использования между файлами .js в моем проекте? - PullRequest
0 голосов
/ 11 января 2019

Я генерирую идентификационный номер (например, 47362) через веб-сервис RESTful. Этот идентификатор зависит от двух строковых параметров. После того как идентификатор сгенерирован, он присваивается переменной с именем instance. Эта функция записывается в виде одноэлементного шаблона в файле generateID.js:

//generateID.js

let Generator = require('./generator');

let GenerateID = (function () {

    let instance;

    return {
        getInstance: function (string1, string2) {
            if (!instance) {
                instance = Generator.generate(string1, string2);
            }
            return instance;
        }
    };

})();

module.exports = GenerateID;

Я хочу поделиться этой переменной с различными файлами тестовых спецификаций, например, такими:

//test1.js

let expect = require('chai').expect;
let Generator = require('../../generator/generator');
let GenerateID = require('../../generator/generateID');

let TS = 'Test Suite';
let T = 'Me';

let TC = 'My First Test';

let step1 = 'step 1';
let step2 = 'step 2';

let ID = GenerateID.getInstance(TS, T);

describe(TC, function() {

    it(step1, function() {

        let result = Generator.add(2, 1);
        Generator.log(ID, step1, result);
        expect(result).to.equal(true);

    });

    it(step2, function() {

        let result = Generator.add(2, 2);
        Generator.log(ID, step2, result);
        expect(result).to.equal(true);

    });

});
//test2.js

let expect = require('chai').expect;
let Generator = require('../../generator/generator');
let GenerateID = require('../../generator/generateID');

let TS = 'Test Suite';
let T = 'Me';

let TC = 'My Second Test';

let step1 = 'step 1';
let step2 = 'step 2';

let ID = GenerateID.getInstance(TS, T);

describe(TC, function() {

    it(step1, function() {

        let result = Generator.sub(4, 2);
        Generator.log(ID, step1, result);
        expect(result).to.equal(true);

    });

    it(step2, function() {

        let result = Generatorsub(9, 4);
        Generator.log(ID, step2, result);
        expect(result).to.equal(true);

    });

});

Когда это выполняется на моем компьютере, два файла JS получают два разных идентификатора.

Эта логика не правильная? Разве это не правильный способ написать и поделиться синглтоном? Как я могу исправить свой код так, чтобы оба файла JS получили одинаковый идентификатор?

1 Ответ

0 голосов
/ 15 января 2019

Я уже выполнял эту задачу раньше, и лучший вариант, который я нашел, это сгенерировать случайный идентификатор через командную строку, сохранить его как переменную среды, а затем передать его в свой wdio командный вызов.

Вот пример использования пакетов cross-env и date-now-cli NPM

cross-env BATCH_ID=`date-now` wdio

Тогда в моем тесте я могу получить идентификатор через process.env:

describe('Test Case', function() {
    it('Should log ID', function() {
        console.log('ID:', process.env.BATCH_ID)
    });
})

Следует знать, что каждый тестовый файл в WebdriverIO порождается в дочернем процессе Node , поэтому все они требуют файлы отдельно. Вот почему разделение между не работает.

Вы также можете взглянуть на переменную global Node и присоединить свою функцию генератора к переменной global.generator в вашем файле wdio.conf.js.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...