Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 如何从flatter包async\u redux模拟reduxing中的调度方法`_Flutter_Redux_Mocking_Async Redux - Fatal编程技术网

Flutter 如何从flatter包async\u redux模拟reduxing中的调度方法`

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

我正在用flutter开发一个android/ios应用程序,我选择使用redux进行状态管理

我正在为我的redux操作编写单元测试,这些操作已使用包实现

我遵循包作者为测试制定的优秀指导原则,但我不确定如何模拟我的测试操作中的进一步操作的调度

例如,下面的
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,并将其注入其中