【问题标题】:Mock UIViewController defined in Storyboard在 Storyboard 中定义的模拟 UIViewController
【发布时间】:2015-02-26 17:13:04
【问题描述】:

我有一个通过 Storyboard 实例化的 UIViewController 类,它包含一个常量属性。对于测试,我想替换/模拟视图控制器的任何值。

我实际上可以通过子类化和定义一个新常量以及覆盖使用它的方法来做到这一点。但是,我不知道如何实例化 ViewController,因为它不在情节提要中。

当然,原始 ViewController 的所有视图和所有其他功能仍然存在,这一点很重要。该怎么办?

【问题讨论】:

  • 运气好能找到答案/解决方案吗?我也尝试过使用 swizzling 和 objc_setClass,但没有任何运气。

标签: ios swift testing uiviewcontroller mocking


【解决方案1】:

如果我了解您需要从 Storyboard 之外的另一个 ViewController 访问属性而不显示它。由于您使用的是 swift,因此您需要做的就是实例化我相信的类本身。例如,如果不在故事板中的 ViewController 有一个名为“SecondController”的类,而第二个控制器中的变量名为“stringVar”,那么您需要做的就是:

var secondVC = SecondController()
secondVC.stringVar = "new string value"

例子:

//SecondVC

import UIKit

class SecondViewController: UIViewController {
    var something:String! = "String Value";
}


//Main VC

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        var secondVC = SecondViewController()
        secondVC.something = "Another String Value"
        println(secondVC.something)

    }

 }

【讨论】:

  • 嗯,如果我这样做,我会得到“调用中的参数 'coder' 缺少参数”。此外,它是我直接在子类中声明时分配的常量。
  • 你在 secondVC 中实现了 initWithCoder 吗?因为我刚刚尝试过,它成功了
  • 感谢您的回答,但我想我忘了说明我需要实现一个需要编码器的初始化程序:要传递 NSCoder 对象。如何创建有效的编码器对象?
  • 我相信您可以将 nil 作为编码器传递,所以它会是 var secondVC = SecondViewController(coder: nil) 我不知道这是否适合您
  • nil 不起作用,new NSCoder() 也不起作用:“*** -decodeObjectForKey:无法发送到 NSCoder 类的抽象对象:创建一个具体实例!” - 我想我现在会跳过这个。感谢您的宝贵时间!
猜你喜欢
  • 2019-03-15
  • 2015-11-17
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-11
相关资源
最近更新 更多