iOS開發中的單元測試:URLManager中的測試用例解析(4)

發表于:2013-11-12來源:sf作者:gaosboy點擊數: 標簽:單元測試
開發自定義規則一般建議同時定義SHORTHAND,即使當前單元測試中不會用到(例如本文中的測試),但這個規則被其他復用的時候,可能會用到SHORTHAND命名。

  開發自定義規則一般建議同時定義SHORTHAND,即使當前單元測試中不會用到(例如本文中的測試),但這個規則被其他復用的時候,可能會用到SHORTHAND命名。

  #import

  OBJC_EXPORT id HC_equalToPoint(CGPoint point);

  #ifdef HC_SHORTHAND

  #define equalToPoint HC_equalToPoint

  #endif

  @interface HCIsEqualToPoint : HCBaseMatcher

  + (id)equalToPoint:(CGPoint)point;

  - (id)initWithPoint:(CGPoint)point;

  @property (nonatomic, assign) CGFloat x;

  @property (nonatomic, assign) CGFloat y;

  @end

  代碼14,擴展匹配規則HC_equalToPoint定義

  在匹配規則的過程中,有一個點需要特別注意,即對匹配對象類型和完整性的判斷。往往開發者把注意力都放在對對象值的匹配上,而忽略了類型和完整性這類判斷,最終導致整個用例運行失敗,但無法準確定位出錯的位置。上面提到的對subviews是否為空的判斷也是這樣的一個例子。所以在自定義的匹配規則中就需要考慮到這方面的問題,如代碼15的matches:方法中,先要對傳入的泛型對象item校驗是否為字符串,后再轉化為CGPoint對象,并進行相應比對。示例中給出的是一種較簡單的情況,在更復雜的情況下,除了對泛型對象的類進行校驗,還要校驗其是否響應某方法,屬性類型,空判斷,等。

  #import "HCIsEqualToPoint.h"

  #import

  id HC_equalToPoint(CGPoint point)

  {

  return [HCIsEqualToPoint equalToPoint:point];

  }

  @implementation HCIsEqualToPoint

  + (id)equalToPoint:(CGPoint)point

  {

  return [[self alloc] initWithPoint:point];

  }

  - (id)initWithPoint:(CGPoint)point

  {

  self = [super init];

  if (self) {

  self.x = point.x;

  self.y = point.y;

  }

  return self;

  }

  - (BOOL)matches:(id)item

  {

  if (! [item isKindOfClass:[NSString class]]) {

  return NO;

  }

  CGPoint point = CGPointFromString((NSString *)item);

  return (point.x == self.x && point.y == self.y);

  }

  - (void)describeTo:(id)description

  {

  [description appendText:@"Point not equaled."];

  }

  @end

  代碼15,擴展匹配規則HC_equalToPoint實現

  一個操作多個測試方法

  以上提到的幾個例子中所測試的都是非常簡單的操作,所以一個測試方法覆蓋了一個或多個操作,但對于較復雜的操作,往往需要多個測試方法,循序漸進的斷言。例如測試通過URL生成UMViewController的用例,生成一個UMViewController實例由簡單到復雜可以有三種簡單方式:簡單的URL生成,帶參數的URL生成和帶Query字典的URL生成,此外還有URL參數和Query字典共用的方式。所以對于這個操作至少需要使用4個測試方法(代碼16)分別進行測試。

  (void)testViewControllerForSimpleURL

  {

  self.viewControllerA = (ViewControllerA *)[self.navigator

  viewControllerForURL:

  [NSURL URLWithString:@"um://viewa"]

  withQuery:nil];

  HC_assertThat(self.viewControllerA, HC_instanceOf([UMViewController class]));

  HC_assertThat(self.viewControllerA, HC_isA([ViewControllerA class]));

  }

  - (void)testViewControllerForURLWithArgs

  {

  self.viewControllerA = (ViewControllerA *)[self.navigator

  viewControllerForURL:[NSURL URLWithString:@"um://viewa?
p1=v1&p2=v2"]

  withQuery:nil];

  HC_assertThat(self.viewControllerA, HC_instanceOf([UMViewController class]));

  HC_assertThat(self.viewControllerA, HC_isA([ViewControllerA class]));

  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.");

  }

  - (void)testViewControllerWithQuery

  {

  self.viewControllerA = (ViewControllerA *)[self.navigator

  viewControllerForURL:

  [NSURL URLWithString:@"um://viewa"]

  withQuery:@{@"k1":@"v1", @"k2":@"v2"}];

  HC_assertThat([self.viewControllerA.query allKeys], HC_containsInAnyOrder
(@"k1", @"k2", nil));

原文轉自:http://blog.segmentfault.com/gaosboy/1190000000270521

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97