Определение динамического c массива в машинописном тексте? - PullRequest
0 голосов
/ 04 мая 2020

У меня есть требование, когда я хочу прочитать определенное значение x (которое автоматически создается каждый раз) в al oop, скажем, n раз. Теперь я хочу сохранить эти автоматически сгенерированные значения x, чтобы позже я мог использовать их и перебирать их для выполнения моих тестов (транспортир).

Я пытаюсь создать Массив с использованием let list: string[] = [];. Теперь я помещаю значения в свой определенный список, используя list.push[x]; на каждой итерации. К концу l oop ожидаем получить результирующий массив, содержащий n значений x (строка) в моем list массиве. Для проверки я делал console.log(list); на каждой итерации, и я вижу, что эти значения помещаются в определенные list.

Позже, в моем коде, если я пытаюсь получить доступ к этим элементам, используя let item = list[0]; Я получаю значение undefined.

Я думаю, мне нужно инициализировать массив до определенного размера, изначально имеющего значения по умолчанию, а затем изменить их позже в l oop. Но, будучи новичком в TypeScript, я не могу найти решение, как это сделать. Пожалуйста, помогите, TIA !!

Вот фрагмент ниже:

    const tests = [
{type: 'admin', id='', uname='foo', pass='bar'},
{type: 'super', id='', uname='foo1', pass='bar'},
{type: 'normal', id='customId', uname='foo', pass='bar'}
];

let list: string[] = [];
// let list = [         //this is the final list that i got from the console.log(list);
// 'QR417msytVrq',
// 'V0fxayA3FOBD',
// 'QnaiegiVoYhs'];

describe(`Open Page `, () => {
  //Code to get to the page

  beforeAll(async () => {
    //initialize page objects

  });

  describe(`Login User `, async () => {
    tests.forEach(test => {
      it(` should login user with `+test.type, async () => {

        //....
        //....


        // On Success
        const myId = userPage.getUID().getText();

        list.push(myId);
        console.log(list);
        console.log(list.length);
      });
    });
  });


  describe(`Delete User`, async () => {

    // describe(`Confirmation `, async () => {
    console.log(list);
    // list.forEach(item => {       //this code doesn't gets executed and wasn't giving any error, so, commented out and tried to access the first element which is undefined.
      let item = list[0];
      console.log(item);            //getting undefined value here. 
      it(` should select and Delete the User having id as ` + item, async () => {
        //code to remove the user having id as item.
      });
    // });
  });
});

1 Ответ

0 голосов
/ 05 мая 2020

Параметры для проверки удаления пользователя:

В конечном итоге, плохая практика - делать тесты зависимыми от других тестов .

Тем не менее, два или, возможно, три варианта, которые должны работать:

A: итерация по списку пользователей в рамках одного теста

describe(`Delete User`, async () => {
    describe(`Confirmation `, () => {
        it(`Log all users out who previously logged in`, async () => {
            list.forEach((item) => {
                console.log(item);
            });
        });
    });
});

Поскольку массив list заполненный предыдущим тестом, вставка кода, зависящего от него, в следующий тест обеспечит наличие значений для работы.

B: Войдите и удалите пользователя за один тест

describe(`Login and delete user `, async () => {
    tests.forEach(test => {
        it(` should login and delete user with ` + test.type, async () => {
            const myId = userPage.getUID().getText();
            // Select and delete myId here
        });
    });
});

Вы можете полностью удалить массив list, поместив весь пользовательский поток в один большой интеграционный тест.

C: использовать фиктивные данные (может быть неприменимо, если данные случайные)

describe(`Delete User`, async () => {
    const list = ["QR417msytVrq", "V0fxayA3FOBD", "QnaiegiVoYhs"];
    describe(`Confirmation `, () => {
        list.forEach((item) => {
            it(
                ` should select and Delete the User having id as ` + item,
                async () => {}
            );
        });
    });
});

Если вы знаете, какие значения удаляются заранее, вы можете добавить их вручную. Если значения генерируются случайным образом, это не сработает.

Другие проблемы:

Порядок выполнения тестирования

Используемый вами синтаксис массива Dynami c выглядит правильно, однако у вас, похоже, есть проблема с порядком выполнения в вашем тесты.

Код в функциях describe, выходящий за рамки спецификаций (блоки it), выполняется до того, как будет выполнен какой-либо код внутри спецификаций. Среда тестирования будет проходить дерево из describe блоков, выполняя любой найденный код, но только принимая во внимание спецификации it. Когда он завершит это, он затем выполняет найденные спецификации it в последовательном порядке.

Когда вы пытаетесь сохранить значение list[0], спецификации 'Login User' еще не выполнены. Более конкретно:

describe(`Login User `, async () => {
    tests.forEach(test => {
        it(` should login user with ` + test.type, async () => {
            // This code is executed AFTER the code in the 'Delete User' 
            // block but BEFORE the 'Delete User' spec
            const myId = userPage.getUID().getText();
            list.push(myId);
        });
    });
});


describe(`Delete User`, async () => {
    // This code is executed before any specs are run
    let item = list[0];
    // List is [] when item is initialized
    // The following spec will therefore not work as item is undefined
    it(` should select and Delete the User having id as ` + item, async () => {
    });
});

Возможным решением этой проблемы было бы изменить строку 'Delete User' spe c на что-то вроде ' should select and Delete first User', а также переместить весь код за пределы spe c внутрь.

Блоки Describe не должны возвращать обещания.

В вашем примере кода есть describe блоков (в частности, 'Login User', 'Delete User' и 'Confirmation'), которые возвращают обещания. Вы должны удалить async перед объявлениями функций. Спецификации могут и должны оставаться прежними. Например:

describe(`Login User `, () => {

Синтаксис объекта

Объект тестов в начале вашего примера не использует синтаксис объекта JS / TS. За каждым ключом следует ставить двоеточие перед значением вместо знака равенства. Вы, вероятно, хотели написать:

const tests = [{
        type: 'admin',
        id: '',
        uname: 'foo',
        pass: 'bar'
    },
    {
        type: 'super',
        id: '',
        uname: 'foo1',
        pass: 'bar'
    },
    {
        type: 'normal',
        id: 'customId',
        uname: 'foo',
        pass: 'bar'
    }
];

Источники:

...