【问题标题】:How to unit test the presenter in a mvp-design in flutter when it is dependent on the view?当它依赖于视图时,如何对 mvp-design 中的演示者进行单元测试?
【发布时间】:2019-11-18 18:18:25
【问题描述】:

我想在 Flutter 中测试 mvp-design 中演示者的功能,但我无法实例化它进行测试,因为它依赖于视图并且视图是有状态小部件的状态。

当我将 null 作为视图时,要测试的函数失败,它会尝试调用视图的函数。

合同:

abstract class View extends BaseView {

  setSelectedWord(String word);

}

abstract class Presenter {
   toTest(word);
}

演讲者:

class PresenterImpl implements Presenter {
  ///
  View _view;

  @override
  toTest(String word) {
    // do sth.
    _view.setSelectedWord(word);
  }
}

查看:

class Screen extends BaseScreen {
  Screen({Key key}) : super(key: key);

  @override
  _State createState() => _State();
}

class _State extends BaseState implementsView {
  ///
  Presenter _presenter;

  setSelectedWord(word){
     //do sth.
   }
}

在此设置中设置演示者进行测试的正确方法是什么?

【问题讨论】:

    标签: unit-testing flutter mvp flutter-test


    【解决方案1】:

    从您的示例代码中不清楚 View 实例是如何被注入到 PresenterImpl 中的,但假设它是通过构造函数,您只需为您的单元测试提供一个不同的 View 实例,一个不依赖 Flutter 的。

    例如,您可以创建一个MockView 类,该类还扩展了View 抽象类,这个MockView 应该不依赖于Flutter,并且不需要应用程序的其余部分的上下文。

    一个简单的例子可能如下所示:

    class MockView extends View {
        String _selectedWord;
        // getter
    
        setSelectedWord(String word) => _selectedWord = word;
    }
    
    presenterTest() {
        String word = "test";
        MockView mockView = MockView();
    
        PresenterImpl underTest = PresenterImpl(mockView);
        underTest.toTest(word);
    
        assert(word == mockView.selectedWord);
    }
    

    顺便说一句,以这种方式进行测试是ViewPresenter 抽象的主要原因之一,以便我们可以提供不同的测试实现。

    【讨论】:

      猜你喜欢
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      相关资源
      最近更新 更多