GHAssertEqualStrings(self.viewControllerA.query[@"k1"], @"v1", @"param error.");
GHAssertEqualStrings(self.viewControllerA.query[@"k2"], @"v2", @"param error.");
}
- (void)testViewControllerForURLAndQuery
{
self.viewControllerA = (ViewControllerA *)[self.navigator
viewControllerForURL:
[NSURL URLWithString:@"um://viewa?p1=v1&p2=v2"]
withQuery:@{@"k1":@"v1", @"k2":@"v2"}];
HC_assertThat([self.viewControllerA.params allKeys], HC_containsInAnyOrder
(@"p1", @"p2", nil));
GHAssertEqualStrings(self.viewControllerA.params[@"p1"], @"v1", @"param error.");
GHAssertEqualStrings(self.viewControllerA.params[@"p2"], @"v2", @"param error.");
HC_assertThat([self.viewControllerA.query allKeys], HC_containsInAnyOrder
(@"k1", @"k2", nil));
GHAssertEqualStrings(self.viewControllerA.query[@"k1"], @"v1", @"param error.");
GHAssertEqualStrings(self.viewControllerA.query[@"k2"], @"v2", @"param error.");
}
代碼16,測試通過URL生成UMViewController的用例
一個測試方法多次斷言
除了一個操作需要多個測試方法的情況,在同一個測試方法中也會有對一個結果進行多次斷言的情況(上述用例代碼16中已經是這種情況,一下用例更具代表性)。這種情況發生在操作結果較為復雜的情況下,例如生成一個UMNavigationController(代碼17)就是這種情況:UMNavigationController的初始化方法是帶RootViewController參數的,所以初始化的實例除了判斷其本身是否為UINavigationController的子類和UMNavigationController實例外,還要判斷rootViewController的合法性,以及viewControllers數組的正確性。
(void)testInitWihtRootViewControllerURL
{
UMNavigationController *navigator = [[UMNavigationController alloc]
initWithRootViewControllerURL:[NSURL URLWithString:@"um://viewb"]];
HC_assertThat(navigator, HC_instanceOf([UINavigationController class]));
HC_assertThat(navigator, HC_isA([UMNavigationController class]));
HC_assertThat(navigator.rootViewController,
HC_instanceOf([UMViewController class]));
HC_assertThat(navigator.rootViewController, HC_isA([ViewControllerB class]));
HC_assertThatInteger(navigator.viewControllers.count, HC_equalToInteger(1));
HC_assertThat(navigator.viewControllers,
HC_hasInAnyOrder(HC_instanceOf([UMViewController class]), nil));
HC_assertThat(navigator.viewControllers,
HC_hasInAnyOrder(HC_isA([ViewControllerB class]), nil));
HC_assertThat(navigator.viewControllers,
HC_hasInAnyOrder(HC_is(navigator.rootViewController), nil));
}
代碼17,測試生成UMNavigationController的用例
總結
本文一共取了URLManager中的17段代碼片段作為例子,介紹了從利用測試框架提供的斷言方法進行簡單的測試,一直到使用自定義匹配引擎規則創建較復雜測試用例,并且提到了部分測試引擎和匹配引擎使用過程中會遇到的陷阱。旨在推動開發者能夠在開發過程中更簡單高效的使用單元測試,為提升代碼質量增加一份保障。讀者可以在URLManager的工程中閱讀更多的測試用例代碼。
原文轉自:http://blog.segmentfault.com/gaosboy/1190000000270521