1

在 iOS 上运行 UI 测试时是否可以交换或修补程序集?目前我有一个项目,我已经设置了 Typhoon 框架,我可以像这样修补程序集

var controller: HomeViewController!

override func setUp() {
    super.setUp()
    // setup assemblies
    var blAssembly = BusinessLogicAssembly()
    var ctrlAssembly = AppAssembly()

    // setup patcher
    let patcher = TyphoonPatcher()
    patcher.patchDefinitionWithSelector("testManager", withObject: {return FakeManager()})

    patcher.patchDefinition(blAssembly.testManager() as TyphoonDefinition, withObject: {
        return FakeManager()})


    let factory = TyphoonBlockComponentFactory(assemblies: [blAssembly, ctrlAssembly])
    factory.attachPostProcessor(patcher)


    // get controller
    controller = factory.componentForKey("homeViewController") as HomeViewController

    // force view to laod
    let vcView = controller.view
}

这工作正常。TestManager它用存根修补。但在这种情况下,我手动调用我的视图控制器。当我运行 UI 测试(启动应用程序时在后台处理控制器)时,是否有办法修补程序集并提供模拟/存根?

例如,假设我有一个调用 Web 服务的视图控制器。Web 服务逻辑包装在一个单独的类中,并使用TyphoonAssembly. 现在对于我的 UI 测试,我不想联系我的实际 Web 服务,而只是证明了示例数据。我想通过创建我的 Web 服务类的存根并返回测试数据来做到这一点。这可以通过 Typhoon 框架实现吗,因为我无法做到这一点,也无法在任何地方找到示例。

我正在使用 Swift,但 Objective-C 答案也可以使用(只要它兼容)

4

1 回答 1

2

现在,Typhoon 有几种方法可以将一个组件换成另一个组件。我们可以使用TyphoonPacher模块化程序集。或者我们甚至可以制作自定义TyphoonDefinitionPostProcessor或 TyphoonInstancePostProcessor。

问题/解决方案:

但是,如果我正确理解了您的问题,那么问题是正在使用应用程序样式(默认)类型的测试,其中:

  • TEST_HOST 标志已设置。您的应用程序类对您的测试是可见的。
  • 集成测试实例化它们自己的程序集,而不是使用应用程序程序集。虽然通常建议这样做,但重要的是要知道这是主应用程序中使用的一个单独的附加程序集。

如果您想从测试中修改主应用程序的程序集,我们可以使用defaultFactory. 如果您使用 plist 集成:

为您的应用委托创建一个定义:

 dynamic func appDelegate() -> AnyObject {
    return TyphoonDefinition.withClass(AppDelegate.self) {
        (definition) in

        //This is a public instance var of type TyphoonComponentFactory
        definition.injectProperty("assembly", with: self)
    }
}    

. . 然后在您的 AppDelegate 中:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    factory.makeDefault()

}

. . . 现在在您的测试或任何您需要的地方,您可以通过挂钩来修补应用程序的程序集:

TyphoonComponentFactory *factory = [TyphoonComponentFactory defaultFactory];
[factory unload]; //clear out any singletons
//Now patch it
  • 请注意,您可能需要先调用factory.unload()清除任何实例TyphoonScopeSingleton
  • 另请注意,如果您愿意,TyphoonPatcher 还允许取消修补或回退。

选择:

或者,更简单(我们建议尽可能简单),也许您可​​以使用不同的网络程序集启动应用程序,在应用程序 plist 中指定不同的程序集集。



*注意:在 Objective-C 中,任何东西TyphoonComponentFactory都可以转换为程序集,反之亦然。这在 Swift 中是不允许的,因此可能会造成一些不便的限制。由#253解决

于 2015-01-05T23:27:46.600 回答