閑話一點:看來大學的學習內容還是有用的,即使是我們覺得毫無作用的內容:至少它們開拓了我們的眼界,讓我們知道還有這樣一門技術。
由於上學期學習了軟件測試,就一直想應用於真實的代碼測試中去。但是最近一直覺得iPhone應用有一些獨特之處。這種獨特之處是所有基於界面的軟件所共有的:移動應用,網頁應用等。仔細一想,其實所有的軟件都是基於界面的嘛。。。
iPhone應用之獨特之處在於:它擁有龐大的與界面相關的方法和Property,而這些東西比較難於進行自動化測試;而且,由於與某種界面(如UITableView)相關的Protocol(如UITableViewDelegatt和UITableViewDataSource)也難於進行測試,導致iPhone應用比較難以測試。我在網上也沒有找到多少測試的資源。
下面進入正題。
前兩天嘗試了一下對iPhone界面進行測試,遇到一個問題。
我建立了一個簡單的基於Single View的類,里面有一個Label,名為show,一個Button,它的TouchUpInsideDown動作對應着buttonPressed方法:將show的text改為"hello"。
這個View是用Interface Builder生成的。
代碼如下:
- -(IBAction)buttonPressed:(id)sender{
- [self.show setText:@"hello"];
- }
-(IBAction)buttonPressed:(id)sender{ [self.show setText:@"hello"]; }在模擬器上跑了一下,成功。
我想對buttonPressed方法進行測試,於是新建了一個Test方法,方法內容如下:
- ViewController* controller =[ [ViewController alloc] init];
- [controller buttonPressed:nil];
- NSLog(@"%@",controller.show.text);
ViewController* controller =[ [ViewController alloc] init]; [controller buttonPressed:nil]; NSLog(@"%@",controller.show.text);但是打印出來的結果是NULL。
仔細思索了一下,我認為應該是ViewController的view沒有初始化,導致無法對controller.show進行操作。根據自己的思考和別人的回答(此頁面),找到一種初始化view的方法,代碼如下:
- ViewController* controller = [[ViewController alloc]initWithNibName:@"ViewController_iPhone" bundle:nil];
- UIView* view = controller.view;
- [controller buttonPressed:nil];
- NSLog(@"%@",controller.show.text);
ViewController* controller = [[ViewController alloc]initWithNibName:@"ViewController_iPhone" bundle:nil]; UIView* view = controller.view; [controller buttonPressed:nil]; NSLog(@"%@",controller.show.text);
代碼有兩點要注意的地方:一是初始化的時候,要使用initWithNibName方法;二是要至少引用一下controller.view,這樣才會初始化這個view;英語原話是“Any reference to the view would also have caused it to load”。
這樣,打印出來的就是“hello”了!
PS:現在有的工程使用的是storyboard,導致沒有nib文件,這時該怎么初始化ViewController呢?
我們可以在storyboard里設置某個ViewController的Identifier,比如為"TestViewControoler",然后使用
- UIStoryboard * storyboard = [ UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil ];
- controller = [storyboard instantiateViewControllerWithIdentifier:@"TestViewController" ];
UIStoryboard * storyboard = [ UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil ]; controller = [storyboard instantiateViewControllerWithIdentifier:@"TestViewController" ];方法,這樣就可以了。
嗯,以后慢慢研究Test-Driven Programming。