不同的测试装配
Different Assembly for Tests
我在项目中使用 Swift、CocoaPods 和 Typhoon。我有一些 classes 可以为我提供网络服务。在我的测试中,我想使用一个不同的 class,它实际上不调用 Web 服务。所以我认为只使用另一个程序集进行测试是个好主意,我在其中注入了假的 web 服务 class.
@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
}
}
Pods 文件
platform :ios, '8.0'
target :Project, :exclusive => true do
pod 'Typhoon', '~> 2.3.4'
end
问题是我在我的程序集中得到 "Use of undeclared type 'TyphoonAssembly'" 进行测试。
有没有最佳实践如何在台风测试中注入其他东西?
这称为模块化程序集,在用户指南 here 中进行了概述。
关键概念是:
- 您定义配方以在程序集中构建实例。其中一些实例可能引用另一个程序集中定义的对象。例如,我们的视图控制器依赖于服务客户端。
- 要引用来自另一个程序集的对象,只需创建该程序集类型的 属性。例如
TyphoonAssembly<MyProtocol>
或 MyAssemblyType*
。
- Typhoon 始终代理对协作程序集的引用。具体实现在启动时提供。您可以提供协议的替代实现或子 class。
到bootstrap台风进行测试:
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
好的做法:如果您希望在几个不同的测试中重用上述程序集 classes,请为此创建一个方法以避免重复。
或者您可能希望修补单个组件,integration testing guide 中对此进行了概述。
我在项目中使用 Swift、CocoaPods 和 Typhoon。我有一些 classes 可以为我提供网络服务。在我的测试中,我想使用一个不同的 class,它实际上不调用 Web 服务。所以我认为只使用另一个程序集进行测试是个好主意,我在其中注入了假的 web 服务 class.
@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
}
}
Pods 文件
platform :ios, '8.0'
target :Project, :exclusive => true do
pod 'Typhoon', '~> 2.3.4'
end
问题是我在我的程序集中得到 "Use of undeclared type 'TyphoonAssembly'" 进行测试。 有没有最佳实践如何在台风测试中注入其他东西?
这称为模块化程序集,在用户指南 here 中进行了概述。
关键概念是:
- 您定义配方以在程序集中构建实例。其中一些实例可能引用另一个程序集中定义的对象。例如,我们的视图控制器依赖于服务客户端。
- 要引用来自另一个程序集的对象,只需创建该程序集类型的 属性。例如
TyphoonAssembly<MyProtocol>
或MyAssemblyType*
。 - Typhoon 始终代理对协作程序集的引用。具体实现在启动时提供。您可以提供协议的替代实现或子 class。
到bootstrap台风进行测试:
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
好的做法:如果您希望在几个不同的测试中重用上述程序集 classes,请为此创建一个方法以避免重复。
或者您可能希望修补单个组件,integration testing guide 中对此进行了概述。