使用依赖项注入在swift中对视图控制器中的UI按钮进行单元测试?
在我的swift应用程序中,我有一个带有几个按钮的视图控制器。当用户与这些按钮交互时,它们会触发可能具有某些依赖关系的代码。它可以看起来像这样:使用依赖项注入在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
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中进行依赖项注入和模拟?这两种依赖注入方法都不理想
提前谢谢