Squeak.ru - шаблоны программирования

Как выйти из теста транспортира из спецификации при определенных условиях?

У меня есть набор, который включает в себя несколько спецификаций. Каждая спецификация использует код некоторых библиотек, которые возвращают отклоненное обещание в случае неудачи.

Я легко могу catch те отклоненные обещания в моей спецификации. Что меня интересует, так это то, что если я могу заставить Protractor выйти из всего набора внутри этой catch функции, потому что следующие спецификации внутри того же набора зависят от успеха предыдущих спецификаций.

Представьте, что у меня есть пакет под названием testEverything, в котором есть следующие спецификации _4 _, _ 5 _, _ 6 _, _ 7_. Если openApp терпит неудачу, все следующие спецификации не будут выполнены из-за зависимости.

Рассмотрим этот код для openApp:

var myLib = require('./myLib.js');

describe('App', function() {

  it('should get opened', function(done) {

    myLib.openApp()
    .then(function() {

      console.log('Successfully opened app');

    })
    .catch(function(error) {

      console.log('Failed opening app');

      if ( error.critical ) {
        // Prevent next specs from running or simply quit test
      }

    })
    .finally(function() {

      done();

    });

  });

});

Как мне выйти из всего теста?


Ответы:


1

Есть модуль для npm под названием protractor-fail-fast. Установите модуль npm install protractor-fail-fast. Вот пример с их сайта, где вы поместите этот код в свой файл conf:

var failFast = require('protractor-fail-fast');

exports.config = {
  plugins: [{
    package: 'protractor-fail-fast'
  }],

  onPrepare: function() {
    jasmine.getEnv().addReporter(failFast.init());
  },

  afterLaunch: function() {
    failFast.clean(); // Cleans up the "fail file" (see below) 
  }  
}

Их URL-адрес находится здесь.

09.05.2016
  • Я знаю об этом, дело в том, что я не хочу, чтобы мой тест провалился при первом неудавшемся ожидании, а хочу вручную, когда я решаю, является ли ошибка критической (неудачный вход в систему, неудачная регистрация и т. Д.) Или нет (неверно отображается имя пользователя). 09.05.2016
  • Ваш сценарий будет делать то, что вы ему говорите, он не может думать сам по себе. Единственный способ вручную остановить тест, когда вы сочтете это целесообразным, - это нажать клавиши Control + C. В вашем вопросе было задано, как остановить тест, если шаг не удался, что может сделать модуль, которым я ответил. Может я неправильно понимаю твой вопрос. 09.05.2016
  • Что меня интересует, так это то, что если я могу заставить Protractor выйти из всего набора внутри этой функции catch ..., у меня будут асинхронные оболочки для операторов ожидания, которые отклонят цепочку обещаний, когда ожидание не выполняется. Как я специально сказал, я хочу выйти из теста вручную, когда поймаю эти отклоненные обещания (в случае, если код ошибки, возвращаемый этими обещаниями, сообщает только о критической ошибке). Это настоящий вопрос. 09.05.2016

  • 2

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

    Я добавил глобальную переменную в файл конфигурации транспортира под названием bail. Рассмотрим следующий код в верхней части файла конфигурации:

    (function () {
    
      global.bail = false;
    
    })();
    
    exports.config: { ...
    

    В приведенном выше коде используется IIFE (выражение с немедленным вызовом функции), которое определяет переменную bail в объекте транспортира global (который будет доступен на протяжении всего теста).

    Я также написал асинхронные оболочки для необходимых мне сопоставителей Jasmine, которые будут выполнять выражение expect с последующим сравнением и возвращать обещание (с использованием модуля Q). Пример:

    var q = require('q');
    
    function check(actual) {
    
        return {
    
          sameAs: function(expected) {
    
              var deferred = q.defer();
              var expectation = {};
    
              expect(actual).toBe(expected);
    
              expectation.result = (actual === expected);
    
              if ( expectation.result ) {
    
                  deferred.resolve(expectation);
              }
              else {
                  deferred.reject(expectation);
              }
    
              return deferred.promise;
    
          }
    
        };
    
    }
    
    module.exports = check;
    

    Затем в конце каждой спецификации я устанавливаю значение bail на основе прогресса спецификации, который будет определяться обещанием этих асинхронных сопоставителей. Считайте следующее в качестве первой спецификации:

    var check = require('myAsyncWrappers'); // Whatever the path is
    
    describe('Test', function() {
    
        it('should bail on next spec if expectation fails', function(done) {
    
            var myValue = 123;
    
            check(myValue).sameAs('123')
            .then(function(expectation) {
    
                console.log('Expectation was met'); // Won't happen
    
            })
            .catch(function(expectation) {
    
                console.log('Expectation was not met'); // Will happen
    
                bail = true; // The global variable
    
            })
            .finally(function() {
    
                done();
    
            });
    
        });
    
    });
    

    Наконец, в начале следующих спецификаций я проверяю bail и возвращаюсь, если необходимо:

    describe('Test', function() {
    
        it('should be skipped due to bail being true', function(done) {
    
            if ( bail ) {
    
                console.log('Skipping spec due to previous failure');
    
                done();
    
                return;
    
            }
    
            // The rest of spec
    
        });
    
    });
    

    Теперь я хочу упомянуть, что существует один модуль под названием protractor-fail-fast, который не справляется со всем тестом всякий раз, когда не выполняется ожидание.

    Но в моем случае мне нужно было установить эту глобальную переменную bail в зависимости от того, какое ожидание не удалось. Я закончил тем, что написал библиотеку (действительно небольшую), которая различает сбои как критические и некритические, а затем, используя это, спецификации будут остановлены только в случае возникновения критического сбоя.

    10.05.2016
  • Это так грустно, что до этого дошло ... Думаю, я позволю своим зависимым задачам потерпеть неудачу, потому что мне не хочется добавлять столько шаблонного кода. У меня точно такая же проблема, и я удивлен, что нет собственного способа сделать это. 17.05.2017
  • @Joffrey Я понимаю, если код слишком длинный для этого. Это должна быть встроенная функция Protractor / Jasmine, поскольку это не так уж и сложно. Может быть, нам стоит добавить проблему в их репозиторий на Github? 17.05.2017
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...