Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用依赖项注入在swift中对视图控制器中的UI按钮进行单元测试?_Swift_Unit Testing_Uiviewcontroller_Dependency Injection_Swift2 - Fatal编程技术网

使用依赖项注入在swift中对视图控制器中的UI按钮进行单元测试?

使用依赖项注入在swift中对视图控制器中的UI按钮进行单元测试?,swift,unit-testing,uiviewcontroller,dependency-injection,swift2,Swift,Unit Testing,Uiviewcontroller,Dependency Injection,Swift2,在我的swift应用程序中,我有一个带有几个按钮的视图控制器。当用户与这些按钮交互时,它们会触发可能具有某些依赖关系的代码。它可以看起来像这样: class ViewController: UIViewController { @IBOutlet weak var button1: UIButton! @IBAction func button1Down(sender: UIButton) { // Do some stuff SomeUti

在我的swift应用程序中,我有一个带有几个按钮的视图控制器。当用户与这些按钮交互时,它们会触发可能具有某些依赖关系的代码。它可以看起来像这样:

class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff

        SomeUtil().doSomething()
    }

}
class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff
        somemethod()
    }

    func somemethod(util: SomeUtil = SomeUtil()) {
        util.doSomething()
    }

} 
 class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!
    var util: SomeUtil!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff
        util.doSomething()
    }

    func injectDeps(util: SomeUtil = SomeUtil()) {
        self.util = util
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        injectDeps()
    }
} 
这是测试的一个主要问题。我想测试视图控制器的界面,即按钮1向下。这个按钮与我想在单元测试中模拟的依赖项相耦合。这种实现不允许模拟

现在,我找到了两种进行依赖项注入的方法,都使用默认参数。我可以(1)如下设置视图控制器:

class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff

        SomeUtil().doSomething()
    }

}
class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff
        somemethod()
    }

    func somemethod(util: SomeUtil = SomeUtil()) {
        util.doSomething()
    }

} 
 class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!
    var util: SomeUtil!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff
        util.doSomething()
    }

    func injectDeps(util: SomeUtil = SomeUtil()) {
        self.util = util
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        injectDeps()
    }
} 
这是可行的,但我并没有真正测试视图控制器的界面。我正在测试一些特定于实现的方法,以避免无法向重写的函数添加默认参数这一事实

我可以(2)如下设置依赖项注入:

class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff

        SomeUtil().doSomething()
    }

}
class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff
        somemethod()
    }

    func somemethod(util: SomeUtil = SomeUtil()) {
        util.doSomething()
    }

} 
 class ViewController: UIViewController {

    @IBOutlet weak var button1: UIButton!
    var util: SomeUtil!

    @IBAction func button1Down(sender: UIButton) {
        // Do some stuff
        util.doSomething()
    }

    func injectDeps(util: SomeUtil = SomeUtil()) {
        self.util = util
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        injectDeps()
    }
} 
这个方法非常适合我在多个方法中使用的实用程序,因为将实用程序保存为实例变量是合理的。对于只在一种方法中使用的实用程序来说,这并不理想。这些实用程序实例没有理由作为实例上的变量关联,只是为了使测试更容易

就模拟而言,我通常只做类似的事情(使用quick framework):

有没有人找到更好的方法在swift中进行依赖项注入和模拟?这两种依赖注入方法都不理想

提前谢谢