objective-c – 如何对互联网协议实施进行单元测试?

我决定在我的项目中添加单元测试,并以测试驱动的方式继续开发.我目前正在为ManageSieve客户端对象实现单元测试,我不确定测试该野兽的最佳方法是什么.

我的SieveClient对象依赖于另外两个用于网络通信的对象:CocoaAsyncSocket和我自己的SaslConn对象,它是我用来处理身份验证方法的Cyrus SASL库的包装器.为了测试,我需要用模拟对象替换它们.我将使用Ocmock框架.我不太清楚如何做到这一点,因为SieveClient对象需要自己创建这些对象.现在我覆盖该对象的(私有)setter,以便始终使用Ocmocks partialMockForObject:方法安装我的模拟对象.但这对我来说不合适.有什么想法可以更好地解决这个问题?

我遇到的另一个问题是套接字本身.为了能够测试协议细节,我需要一种从套接字返回预定义测试数据的方法.我想我可以使用Ocmock机制伪造套接字的返回值.但是由于CocoaAsyncSocket提供了许多不同的方法来从套接字读取数据,我必须确切地知道协议对象使用哪种顺序.我不希望我的单元测试依赖于我的协议对象的实现细节.那我该怎么办?手动为套接字类实现模拟对象?这似乎并不重要,所以我可能也需要进行单元测试.这是一个好主意吗?

我读过,如果有些东西很难测试,它的设计可能也不是很好.但我不知道我怎么能做得更好,因为困难的部分在于我必须做的插座交互.

如果您想查看代码,可以在Bitbucket找到它:SieveClient.mSieveClient.h

编辑:依赖注入

所以我读到了依赖注入,我想我将使用它来将AsyncSocket和SaslConn对象放入我的SieveClient对象中.我将更改我的构造函数以接受这些对象并使用它们.由于这个类的用户通常不关心套接字和SASL对象,我将添加一个工厂方法(以方便构造函数的形式),只创建这些对象并将它们传递给构造函数.

但这只解决了我测试问题的第一个(也更容易)部分.

解决方法

你能把你正在做的事分成两部分,其中一部分是抽象协议,另一部分是对套接字的绑定?然后,您可以更轻松地测试抽象协议,并将绑定测试集中在是否正确调用任何连接的抽象协议的方法/操作上.

抽象地说,您将减少代码各部分之间的耦合.这增加了可测试性,代价是总体复杂性有所增加(虽然不是太糟糕,因为你通过分离关注来获得更好的工具来管理它)和一些潜在的性能下降(尽管大多数系统没有太大的问题;你的计算机比它的I / O子系统快得多.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...