Nano Hash - криптовалюты, майнинг, программирование

Тестирование: как утверждать между двумя последовательными promises/run.laters? Как пропустить `run.later` в тестах?

Вот простой компонент:

App.FooBarComponent = Ember.Component.extend({   
  tagName: "button",   
  status: "Ready",
  revertStatusPeriodMs: 2000,
  
  click: function() {
    this.set('status', 'Pending');
    
    // A fake ajax
    this.run()
      .then( function() {
        this.updateStatus('Finished');
      }.bind(this))
      .catch( function() {
        this.updateStatus('Error');
      }.bind(this));
  },
  
  run: function() {
    return new Ember.RSVP.Promise( function(resolve) {
      Ember.run.later( function() {
        resolve();
      }, 500);
    });
  },
  
  updateStatus: function(statusText) {
    this.set('status', statusText); 
    
    var periodMs = this.get('revertStatusPeriodMs') || 1000;
    
    Ember.run.later( function() {
      this.set('status', 'Ready');
    }.bind(this), periodMs);
  }
});

Он делает простую вещь: при нажатии на него отображается текст. Позже заменяет текст другим. Еще позже он возвращает текст к исходному.

Код работает нормально. Моя проблема в том, что я не могу написать для него тест.

test('clicking the button should set the label', function(assert) {
  expect(4);
  
  visit('/');
  
  assert.equal( find('button').text().trim(), 'Ready', 'Should initially be "Ready"');
  
  andThen(function() {
    click('button');
    assert.equal( find('button').text().trim(), 'Pending', 'Should "Pending" right after click');
  });
  
  // This one fires too late!
  andThen(function() {
    assert.equal( find('button').text().trim(), 'Finished', 'Should become "Finished" after promise fulfills');
  });
  
  andThen(function() {
    assert.equal( find('button').text().trim(), 'Ready', 'Should eventually return to the "Ready" state');
  });
});

У меня две проблемы:

  1. Я не могу проверить состояние Finished. Кажется, что andThen ждет завершения всех обещаний и run.later, а я хочу проверить промежуточное состояние. Как запустить утверждение между двумя последовательными обещаниями/run.later?

  2. Времена могут быть долгими, а тесты могут длиться целую вечность. Обычно я не возражаю против рефакторинга кода для лучшей тестируемости, но я отказываюсь корректировать время в приложении в зависимости от среды (например, 2000 для dev/prod, 0 для теста). Вместо этого я хотел бы использовать макет таймера или какое-либо другое решение.

    Я пробовал Sinon и потерпел неудачу: когда я издеваюсь над таймером, andThen никогда не возвращается. Ни одно из этих решений не помогло мне.

JSBin: http://emberjs.jsbin.com/fohava/2/edit?html,js,output (Sinon включен)

28.02.2015

Ответы:


1

Кажется, что ни один из ваших тестовых кодов не использует asynch, что может показаться важным, поскольку без каких-либо различий последние 2 теста будут выполняться в одном и том же тике (тесты 3 и 4 не могут быть истинными одновременно). Я не знаком с QUnit, но нашел его asyncметод, который кажется уместным . Однако, когда я попытался позвонить assert.async, он взорвался. Я попытался обновить QUnit 1.17, все еще без костей.

Так что у меня нет решения для вас. Проблема, однако, в том, что Ember выполнит оба теста andThen только после завершения всего асинхронного выполнения — это означает, что тест 3 никогда не будет верным.

10.03.2015
  • Я полагаю, помощник andThen использует assert.async. Что до остального, то я и так уже знал. Но спасибо, что вмешался, Барни. 10.03.2015
  • Что ж, понятно, что встроенные помощники Ember недостаточно детализированы, поэтому им, вероятно, следует отказаться от явных вызовов QUnit API... Но опять же, я просто играю в гольф с незнакомой настройкой! 10.03.2015

  • 2

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

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

    Однако причина, по которой я отвечаю сейчас, заключается в том, что я нашел PR, который может быть вам полезен: PR 10463

    Я не вдавался в подробности, но, по-видимому, это «позволяет пользовательским помощникам по асинхронным тестам приостанавливать выполнение, возвращая обещание».

    Я не уверен, какую версию Ember вы используете, но если вы сможете выдержать этот пиар, он может вам помочь.

    17.03.2015
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..