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