1

我在我的项目中使用 Swift、CocoaPods 和 Typhoon。我有一些课程可以为我提供 Web 服务。在我的测试中,我想使用一个实际上不调用 Webservice 的不同类。所以我认为只使用另一个程序集进行测试是一个好主意,我在其中注入了虚假的 webservice 类。

@objc public protocol AuthService {
    func auth(username: String!, password:String!, onSuccess: (Token!) -> (Void), onError:(NSError!) -> (Void))
}

// "real" implementation
public class AuthServiceImpl: NSObject, AuthService {
    public func auth(username: String!, password:String!, onSuccess: (Token!) -> (Void), onError:(NSError!) -> (Void)){
       // do some webservice calls
    }
}

 // "fake" implementation
public class AuthServiceTestImpl: NSObject, AuthService {
    public func auth(username: String!, password:String!, onSuccess: (Token!) -> (Void), onError:(NSError!) -> (Void)){
       // do some file readings
    }
}

豆荚文件

platform :ios, '8.0'

target :Project, :exclusive => true do
   pod 'Typhoon', '~> 2.3.4'
end

问题是我在我的装配中得到“使用未声明的类型'TyphoonAssembly'”进行测试。是否有最佳实践如何在台风测试中注入其他东西?

4

1 回答 1

0

这称为模块化组件,并在此处的用户指南中进行了概述。

关键概念是:

  • 您定义配方以在程序集中构建实例。其中一些实例可能引用在另一个程序集中定义的对象。例如我们依赖于服务客户端的视图控制器。
  • 要引用将来自另一个程序集的对象,只需创建该程序集类型的属性。例如TyphoonAssembly<MyProtocol>MyAssemblyType*
  • Typhoon 总是代理对协作程序集的引用。具体实现在启动时提供。您可以提供协议或子类的替代实现。

引导 Typhoon 进行测试:

let applicationAssembly = ApplicationAssembly()
let networkComponents = TestNetworkComponents()
TyphoonAssemblyActivator.withAssemblies([
    applicationAssembly, 
    networkComponents]).activate()

//This view controller will now be injected with test network components. 
let controller = assembly.viewController() as MyViewController

良好实践:如果您希望在几个不同的测试类中重用上述程序集,请为此创建一个方法以避免重复。

或者,您可能希望修补集成测试指南中概述的单个组件。

于 2015-02-26T11:35:03.257 回答