用于测试的不同组装
Posted
技术标签:
【中文标题】用于测试的不同组装【英文标题】:Different Assembly for Tests 【发布时间】:2015-02-26 09:11:38 【问题描述】:我在我的项目中使用 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
Pod 文件
platform :ios, '8.0'
target :Project, :exclusive => true do
pod 'Typhoon', '~> 2.3.4'
end
问题是我在我的装配中得到“使用未声明的类型'TyphoonAssembly'”进行测试。 是否有最佳实践如何在台风测试中注入其他东西?
【问题讨论】:
我不确定我是否在答案中提到了“使用未声明的类型 'TyphoonAssembly'”'?如果仍然有问题,请告诉我。我假设您已经阅读:***.com/questions/25382348/… 【参考方案1】:这称为模块化组件,并在用户指南here 中进行了概述。
关键概念是:
您定义配方以在程序集中构建实例。其中一些实例可能引用在另一个程序集中定义的对象。例如我们依赖于服务客户端的视图控制器。 要引用来自另一个程序集的对象,只需创建该程序集类型的属性。例如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
良好做法:如果您希望在多个不同的测试类中重用上述程序集,请为此创建一个方法以避免重复。
或者,您可能希望修补单个组件,这在integration testing guide 中进行了概述。
【讨论】:
答案假定台风 3.0。 Typhoon 2.0 风格(仍然适用于 Typhoon 3.0)略有不同。我展示了 3.0 样式(装配激活器),因为它更好。 . .如果一切都清楚,请告诉我。以上是关于用于测试的不同组装的主要内容,如果未能解决你的问题,请参考以下文章