Как передать возвращаемое значение из beforeAll в функцию, которая запускает спецификацию в jasmine?

#jasmine #protractor #specifications

#jasmine #транспортир #спецификации

Вопрос:

Мой код, как показано ниже

 describe("Smoke-Test-", function() {     
    beforeAll(async function() {
        getSteps = await specGenerator.execute(); //value is returned properly here
        return getSteps //this returns an array object      
    });
  
    beforeAll(async function () {
        const remote = launch.command;
        return page = po.init(remote)
            .maximizeWindow()
            .get(url)
            .sleep(2000);
    });
    
        
    testRunner(getSteps) `//I want to use return value in function and call spec below. Is this possible? Execute function should be run as per the count`
Here getSteps returns Number.
    
    function testRunner(count) {
      it('test', async function () {            
        for(var j=0;j< count;j  )
        {
            execute()                       
        }                           
       });
    }       
  

Ожидается: получить возвращаемое значение из beforeAll и использовать его в функции для вызова или запуска спецификации.

Фактически: возвращаемое значение недоступно вне beforeAll.

Обновить:

  it('test', async function () {
 console.log(getSteps) //prints value as I moved inside it as suggested
 testRunner(getSteps) //this should trigger testRunner function 
 }
  

Но это завершается ошибкой,

 Error: 'it' should only be used in 'describe' function
  

Как мы запускаем одну спецификацию из другой спецификации?

Ответ №1:

Когда вы запускаете транспортир, он выбирает файлы спецификаций, указанные в конфигурации, и выстраивает очередь из describe , it , beforeAll и afterAll блоков. ВАЖНАЯ ДЕТАЛЬ ЗДЕСЬ ЗАКЛЮЧАЕТСЯ В ТОМ, ЧТО ЭТО ПРОИСХОДИТ ЕЩЕ ДО ЗАПУСКА БРАУЗЕРА.

Посмотрите на этот пример

 let conditionIsTrue; // undefined
  it('name', () => {
    conditionIsTrue = true;
  })
if (conditionIsTrue) { // still undefined
  it('name', () => {
  })
}
  

К тому времени, когда транспортир достигает if() инструкции, значение conditionIsTrue все еще undefined равно. И, возможно, оно перезаписывается внутри этого блока позже, при запуске браузера, но не при создании очереди. Поэтому он пропускает его.

Другими словами, транспортир знает, какие блоки описания он будет запускать, еще до того, как он откроет браузер, и эта очередь НЕ может быть изменена во время выполнения

Комментарии:

1. @sridattas если вы опубликуете содержимое specGenerator.execute() , я, возможно, смогу найти обходной путь

2. Я узнал об этом очень рано, когда начал работать с транспортиром. Я должен регулярно объяснять это своей команде.

3. @SergeyPleshakov Я обновил функциональный блок. specGenerator.execute() возвращает число, и на основе этого числа должна выполняться функция TestRunner. Содержимое specGenerator.execute() очень велико.