测试私有的@IBOutlets和@IBActions

时间:2016-10-05 07:37:55

标签: ios swift xctest

我们可以将@IBOutlets@IBAction设为私有。 示例:

class MyViewController: UIViewController {

    @IBOutlet private weak var myLabel: UILabel!

    @IBAction private func nextTapped(sender: UIButton) {
        // Do something
    }

}

我们无法在课堂外访问这些属性和方法,这是件好事。

但是如何通过私人网点和行动来测试课程呢?有没有办法在XCTestCase中测试私有插座或方法,或者我必须将它们暴露在课堂内部?

出于测试的目的@IBOutlet s / @IBAction应该在内部可见?

2 个答案:

答案 0 :(得分:4)

无法使用$data = array(); $t = false; $st = false; if (($handle = fopen($filename, 'r')) !== FALSE) { $header = fgetcsv($handle, 1000, $delimiter); while (($row = fgetcsv($handle, 1000, $delimiter)) !== FALSE) { $level = $row[count($row)-1]; if($level=='T') { $t = $row[0]; $data[$t][$header[1]] = $row[1]; } elseif($level=='ST'){ $st = $row[0]; $data[$t][$st][$header[1]] = $row[1]; } else{ $tmp_row = array( $header[0] => $row[0], $header[1] => $row[1], $header[2] => $row[2] ); $data[$t][$st][] = $tmp_row; } } fclose($handle); } print_r($data); 测试private方法。

这是因为Swift的XCTest非常私有,编译器使用这些信息来更好地优化代码。

要测试方法,必须为privatepublic,然后您可以使用internal导入模块。

摘自Should I test private methods or only public ones?

  

我没有对私有方法进行单元测试。私有方法是应该为类的用户隐藏的实现细节。测试私有方法会破坏封装。

答案 1 :(得分:0)

私有方法也必须进行测试,但关键是在测试类中没有任何改变来运行测试

默认情况下,您可以从单元测试中访问IBOutlets,但是如果您将它们设置为私有,则可以始终在测试中创建您的类的新MockSubclass,然后公开私有内容。

在测试期间,只需实例化您的模拟子类并调用一个返回私有插座的函数。

注意!让你的模拟类始终处于测试目标之下。