Flutter 如何从flatter包async\u redux模拟reduxing中的调度方法`
我正在用flutter开发一个android/ios应用程序,我选择使用redux进行状态管理 我正在为我的redux操作编写单元测试,这些操作已使用包实现 我遵循包作者为测试制定的优秀指导原则,但我不确定如何模拟我的测试操作中的进一步操作的调度 例如,下面的Flutter 如何从flatter包async\u redux模拟reduxing中的调度方法`,flutter,redux,mocking,async-redux,Flutter,Redux,Mocking,Async Redux,我正在用flutter开发一个android/ios应用程序,我选择使用redux进行状态管理 我正在为我的redux操作编写单元测试,这些操作已使用包实现 我遵循包作者为测试制定的优秀指导原则,但我不确定如何模拟我的测试操作中的进一步操作的调度 例如,下面的LogoutAction发送一个DeleteDatabaseAction并等待它完成: 类LogoutAction扩展了ReduxAction{ @凌驾 Future reduce()异步{ 等待dispatchFuture(DeleteD
LogoutAction
发送一个DeleteDatabaseAction
并等待它完成:
类LogoutAction扩展了ReduxAction{
@凌驾
Future reduce()异步{
等待dispatchFuture(DeleteDatabaseAction());
返回AppState.initialState();
}
}
类DeleteDatabaseAction扩展了ReduxAction{
@凌驾
未来或减少{
抛出状态错误(
'对DeleteDatabaseAction的运行时实现的不必要调用',
);
}
}
void main(){
最终存储=存储(初始状态:AppState(loggedIn:true));
最终storeTester=storeTester.from(存储);
test('注销操作应返回正确的状态,而不是抛出StateError',()异步{
storeTester.dispatch(LogoutAction());
TestInfo=wait storeTester.wait(LogoutAction);
expect(info.state.loggedIn,false);
});
}
我只想测试被测试的操作,并剔除所有进一步的操作调用
i、 e.如何在reduxation
上模拟/存根dispatch
和dispatchFuture
方法,以便运行时DeleteDatabaseAction
实现不运行
到目前为止,我已尝试:
- 使用get\u it注入
,并在测试期间注入模拟DeleteDatabaseAction
- 我现在有100多个动作需要添加到我的上下文中
- 某些操作的参数会根据调用位置发生变化,因此无法在应用程序启动时注册
- 子类
,重写上述方法并在我的测试中使用子类Store
final Store=Store(initialState:AppState(loggedIn:true))
- 我将无法在测试中分派我的操作,因为它在async_redux测试实现中使用相同的存储
- 这里:
storeTester.dispatch(LogoutAction())代码>
- 创建一个单独的
实现,在测试期间注入该实现并使用模拟进行覆盖Dispatcher
- 这将起作用,但这是一个新的框架,我可以走这条路,但现在我偏离了asyn_redux提供的文档丰富的框架
MockStore
,而不是常规的Store
。MockStore
有一个mocks
参数,该参数是一个映射,其中键是动作类型,值是mock。例如:
class DeleteDatabaseAction extends ReduxAction<AppState> {
@override
Future<AppState> reduce() {
await dao.deleteDatabase();
return null;
}
var-store=MockStore(
initialState:initialState,
模拟:{
MyAction1:。。。
我的行动2:。。。
...
},
);
但是,还有其他方法:
get_it
或其他依赖注入代码将http客户端注入到action reducer中。这很有效
class DeleteDatabaseAction extends ReduxAction<AppState> {
@override
Future<AppState> reduce() {
await dao.deleteDatabase();
return null;
}
类DeleteDatabaseAction扩展了ReduxAction{
@凌驾
未来减少(){
等待dao.deleteDatabase();
返回null;
}
然后,您可以模拟DAO本身,或者通过get\u it
注入DAO。您还可以使DAO成为某个BaseAction
(扩展ReduxAction
)的getter,并将其注入其中