我的SieveClient对象依赖于另外两个用于网络通信的对象:CocoaAsyncSocket和我自己的SaslConn对象,它是我用来处理身份验证方法的Cyrus SASL库的包装器.为了测试,我需要用模拟对象替换它们.我将使用OCMock框架.我不太清楚如何做到这一点,因为SieveClient对象需要自己创建这些对象.现在我覆盖该对象的(私有)setter,以便始终使用OCMocks partialMockForObject:方法安装我的模拟对象.但这对我来说不合适.有什么想法可以更好地解决这个问题?
我遇到的另一个问题是套接字本身.为了能够测试协议细节,我需要一种从套接字返回预定义测试数据的方法.我想我可以使用OCMock机制伪造套接字的返回值.但是由于CocoaAsyncSocket提供了许多不同的方法来从套接字读取数据,我必须确切地知道协议对象使用哪种顺序.我不希望我的单元测试依赖于我的协议对象的实现细节.那我该怎么办?手动为套接字类实现模拟对象?这似乎并不重要,所以我可能也需要进行单元测试.这是一个好主意吗?
我读过,如果有些东西很难测试,它的设计可能也不是很好.但我不知道我怎么能做得更好,因为困难的部分在于我必须做的插座交互.
如果您想查看代码,可以在Bitbucket找到它:SieveClient.m和SieveClient.h
编辑:依赖注入
所以我读到了依赖注入,我想我将使用它来将AsyncSocket和SaslConn对象放入我的SieveClient对象中.我将更改我的构造函数以接受这些对象并使用它们.由于这个类的用户通常不关心套接字和SASL对象,我将添加一个工厂方法(以方便构造函数的形式),只创建这些对象并将它们传递给构造函数.
但这只解决了我测试问题的第一个(也更容易)部分.