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

Flutter Testing Redux-Saga с аргументом действия

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

NoSuchMethodError: Closure call with mismatched arguments: function 'startUp'
Receiver: Closure: ({dynamic action}) => dynamic from Function 'startUp': static.
Tried calling: startUp(Bootstrap)
Found: startUp({dynamic action}) => dynamic

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

// Action
class Bootstrap {
  final String name;
  Bootstrap (this.name);
}

// Saga
startUp({dynamic action}) sync* {
  // todo api call
  yield Put(Load(action.name));
}


watchSaga() sync* {
  yield TakeLatest(startUp, pattern: Bootstrap);
}


// Test
void main() {
  group('Middleware tests', () {
    test('callApi test', () async {
      var sagaMiddleware = createTestMiddleware();

      var dispatched = [];

      sagaMiddleware.dispatch = (dynamic action) {
        dispatched.add(action);
      };

      sagaMiddleware.getState = () {
        return 'test';
      };

      var task =
          sagaMiddleware.run(startUp, args: [Bootstrap]); // Bootstrap is the action class
      expect(task.toFuture(), completion(equals(0)));
      expect(task.toFuture().then((value) => dispatched),
          completion([TypeMatcher<Load>()]));
    });
  });
}

Ответы:


1

Сначала вы должны запустить watchSaga. Затем вы можете отправлять действия, и он будет обрабатывать случаи запуска саги startUp. Я рекомендую вам протестировать функции генератора саги для тестирования.

Проверьте следующую ссылку для тестирования саг.

https://github.com/reduxsaga/redux_saga/blob/master/doc/advanced/Testing.md

Чтобы узнать, как использовать эффект TakeLatest, вы можете проверить;

https://pub.dev/documentation/redux_saga/latest/redux_saga/TakeLatest.html

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

Для вашего случая это будет выглядеть следующим образом:

import 'package:redux_saga/redux_saga.dart';
import 'package:test/test.dart';

bool called = false;

void Load(name) async {
  //do something here
  called = true;
}

// Action
class Bootstrap {
  final String name;
  Bootstrap(this.name);
}

// Saga
startUp({dynamic action}) sync* {
  // todo api call
  print('here');
  yield Call(Load, args: [action.name]);
}

watchSaga() sync* {
  yield TakeLatest(startUp, pattern: Bootstrap);
}

void main() {

  group('Middleware tests', () {
    test('callApi test', () async {
      var sagaMiddleware = createTestMiddleware();

      //var dispatched = [];

      // sagaMiddleware.dispatch = (dynamic action) {
      //   print(action);
      //   dispatched.add(action);
      // };

      // sagaMiddleware.getState = () {
      //   return 'test';
      // };

      sagaMiddleware.run(watchSaga);

      called = false;

      var task = sagaMiddleware.run(() sync* {
        yield Put(Bootstrap('load_something'));
      });

      expect(task.toFuture().then((value) => called), completion(equals(true)));
    });
  });
}

Обратите внимание, что вы не должны использовать здесь поддельные методы (dispatch и getState), чтобы позволить TakeLatest работать правильно.

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

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

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

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

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

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

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

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