Упрощение тестирования трепетания с аргументом действия

#flutter #dart #redux-saga #flutter-test #flutter-redux

#трепетание #дротик #сокращение саги #тест на трепетание #уменьшение трепетания

Вопрос:

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

 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
 

Как мне протестировать эту сагу?
Приведенный ниже тестовый пример взят из документации flutter redux saga, однако он совсем не обширный

 // 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. Затем вы можете отправлять действия, и он будет обрабатывать случаи запуска и запуска. Я рекомендую вам протестировать функции генератора saga для тестирования.

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

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

О том, как использовать эффект takeLatest, вы можете узнать в;

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

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

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

 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 функционировать должным образом.