我们应该在构造函数中放置多少初始化代码?问题在于,输入大量代码会导致测试期间出现问题,因为某些字段可能取决于平台特定的事物,例如BER或NFC.例如:

class MyClass{
 late Hardware hardware;

 MyClass()
 {
   hardware = Hardware();        //platform dependent object 
   hardware.onEvent.listen(..);  //subscribe to hardware events
    ...
 }

}

然后我想测试MyClass,但我遇到了问题,因为硬件在测试期间无效.

test('test something', () {
  var myClass = MyClass();//errors or bad behaviour here
  
   ...
});

});

也许让构造函数尽可能简单,然后使用"初始化"函数是有意义的?

推荐答案

这个特定问题的解决方案是让类通过定义其行为但不定义其实现的接口来引用"硬件".

如果Hardware类没有接口(或者它对您来说太特定),您可以创建自己的接口并围绕实现该接口的硬件创建一个适配器类.

然后,实际的硬件对象(可能包装在适配器中)应该在构造函数中或使用设置器(而不是使用new来创建实现)传递给类.这样,班级就不知道它正在处理的硬件的具体细节.

在测试中,您可以创建模拟硬件类来模拟真实的硬件类.

实际的硬件实现对象将在此类外部以某段代码创建,其工作是了解具体细节.您甚至可以动态地构建硬件对象.

您可能会发现查找"依赖注入"和Spring等框架很有用.

解决"测试对象"问题的另一种替代方法是使用Mockito等创建模拟对象的库.

Dart相关问答推荐

如何扩展 Dart 套接字 BroadcastStream 缓冲区大小为 1024 字节?

Dart 扩展: don't access members with "this" unless avoiding shadowing

如何在 Dart 中返回函数?

如何为屏幕设置不同的主题?

你如何在 Polymer 中调度和监听自定义事件?

如何在 Flutter 包/插件开发中添加assets?

如何等待forEach完成异步回调?

如何防止键盘在Flutter中按提交键时失效?

为http POST请求从Flutter上的TextFormField捕获数据

如何使用 Dart 动态加载 HTML 并插入我的网页?

Flutter 中 ListView.builder 中的反向列表

如何在 Dart 中上传文件?

Dart:打印整数和字符串

Dart 中的构造函数和初始化列表有什么区别?

如何在 Dart 中尚不存在的目录 struct 中创建文件?

Dart 中 await for 和 listen 的区别

导出两个具有相同类名的库

你如何在 Dart 中创建一个 Stream?

如何判断一个对象是否是一个类的实例

列出dart中双点(.)的使用?