• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 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

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>