URLManager是一個基於UINavigationController和UIViewController,以URL Scheme為設計基礎的導航控制項,目的是實現ViewController的松耦合,不依賴。
準備架構,定義基類
首先按照之前的兩篇文章介紹的方法匯入單元測試架構和匹配引擎架構,建立好測試Target,並配置編譯選項。
定義測試案例基類:UMTestCase(代碼1),其他用例全部繼承自UMTestCase。
#import <GHUnitIOS/GHTestCase.h>@interface UMTestCase : GHTestCase@end
代碼1,UMTestCase,用例基類
構建用例
URLManager工具類(UMTools)測試案例(UMToolsTestCase)。UMTools中擴充了NSURL,NSString和UIView,方法涉及到給URL添加QueryString和從QueryString中讀取參數,對字串做子串判斷,進行URL的編碼和解碼,對UIView的x,y,width和height的直接讀寫等。需要在用例中定義測試過程中會使用到屬性(代碼2), 並在setUpClass中初始化他們(代碼3)。
// 一般字元串,帶有字母和數字@property (strong, nonatomic) NSString *string;// 一般字元串,僅帶有字母@property (strong, nonatomic) NSString *stringWithoutNumber;// 將被做URLEncode的字串,含有特殊字元和漢字@property (strong, nonatomic) NSString *toBeEncode;// 把 toBeEncode 編碼後的串@property (strong, nonatomic) NSString *encoded;// 普通的URL,帶有QueryString@property (strong, nonatomic) NSURL *url;// 去掉上邊一個URL的QueryString@property (strong, nonatomic) NSURL *noQueryUrl;// 一個普通的UIView@property (strong, nonatomic) UIView *view;
代碼2,定義屬性
(void)setUpClass{ self.string = @"NSString For Test with a number 8848."; self.stringWithoutNumber = @"NSString For Test."; self.toBeEncode = @"~!@#$%^&*()_+=-[]{}:;\"'<>.,/?123qwe漢字"; self.encoded = @"%7E%21%40%23%24%25%5E%26%2A%28%29_%2B%3D-%5B%5D%7B%7D%3A%3B%22%27%3C%3E.%2C%2F%3F123qwe%E6%B1%89%E5%AD%97"; self.url = [NSURL URLWithString:@"http://example.com/patha/pathb/?p2=v2&p1=v1"]; self.noQueryUrl = [NSURL URLWithString:@"http://example.com/patha/pathb/"]; self.view = [[UIView alloc] initWithFrame:CGRectMake(10.0f, 10.0f, 100.0f, 100.f)];}
代碼3,初始化屬性
使用單元測試架構中的斷言處理簡單用例
單元測試是白盒測試,要做到路徑覆蓋(代碼4)。 對“ContainsString”的測試進行正向和反向兩種情況(即YES和NO兩種返回結果)。
#pragma mark - UMString- (void)testUMStringContainsString{ NSString *p = @"For"; NSString *np = @"BAD"; GHAssertTrue([self.string containsString:p], @"\"%@\" should contains \"%@\".", self.string, p); GHAssertFalse([self.string containsString:np], @"\"%@\" should not contain \"%@\".", self.string, p);