iOS 單元測試OCMock介紹

來源:互聯網
上載者:User
OCMock總結 使用OCMock是為了某些不容易構造或者不用一擷取的對象,用一個虛擬對象來建立以便測試。在cocoa編程測試使用系統內建的ocunit,或者第三方的ghunit都沒有mock,一般使用oc mock和ghunit的組合來搭建測試架構來測試。
mock基本的用法有從class初始化mock對象,
id mock = [OCMockObject mockForClass:[SomeClass class]]
初始化mock對象之後可以使用expect 和verify組合來進行驗證。
[[mock expect] someMethod:someArgument]
中間調用其他代碼會調用someMethod
[mock verify]
expect 也可以驗證傳回值,例如
[[[mock expect] andReturn:@"Objective-C"] lowercaseString];

stub 構造介面返回資訊,但不驗證, expect 和 stub 在實現上的區別是,在mockobject上有個expectations數組,expect後會把stub後的對象加到該數組, verify 時候對expectations數組驗證。
[[[mock stub] andReturn:aValue] someMethod:someArgument]
告訴mock對象 當someMethod調用時候,應該返回aValue
也可以拋出異常
[[[mock stub] andThrow:anException] someMethod:someArgument]
或者發送訊息
[[[mock stub] andPost:aNotification] someMethod:someArgument]
或者委託另外一個對象
[[[mock stub] andCall:@selector(aMethod:) onObject:anObject] someMethod:someArgument]
可以使用and Return, and Throw, and Post, and call onObject 組合使用

除了從class得到mock對象,還能從protocol得到,
id aMock = [OCMockObject mockForProtocol:@protocol(SomeProtocol)]
另外有一種Partial mocks
id aMock = [OCMockObject partialMockForObject:anObject]
當方法沒有使用stub之後被調用之後,會被返回到anObject,當一個stub的方法被調用時候使用anObject的引用。
當mock object的一個方法沒有expect或者stub之後被調用會產生一個異常,而如果使用niceMock來初始化被忽略。
id mock = [OCMockObject niceMockForClass:[SomeClass class]]
可以不允許指定的方法:
[[mock reject] someMethod]

OCMock 文檔: http://ocmock.org/

GHUnit 總結
相比內建的ocunit,GHUnit可以相容ocunit的文法,並提供了非同步測試的方法。測試target是一個獨立的app,可以加斷點和可以在真機上運行。
使用GHAsyncTestCase 非同步測試
例如
- (void)testThatDelegateCanOverrideActionSheetDisplay {
   self.actionBar.delegate = self;
   
   [self prepare];
   [self.actionBar shareButtonTouched:nil];
   [self waitForStatus:kGHUnitWaitStatusSuccess timeout:1.0];
}

- (void)actionBar:(SocializeActionBar *)actionBar wantsDisplayActionSheet:(UIActionSheet *)actionSheet {
//    GHAssertEquals(actionSheet, self.mockShareActionSheet, @"Bad action sheet");
   [self notify:kGHUnitWaitStatusSuccess];
}
先調用prepare,調用方法後,再等待  kGHUnitWaitStatusSuccess訊息。自己實現了actionBar: wantsDisplayActionSheet:的delegate方法,發送 kGHUnitWaitStatusSuccess。

GHUnit文檔:https://github.com/gabriel/gh-unit


Kif 總結
kif ,”keep it functional”,可以讓iOS通過在模擬器上類比使用者互動行為的方式來做整合測試。
類比使用者的行為包括,輸入文字,點擊等等,驗證方式可以使用是否跳轉到指定View等。

使用方式是先把原來的target複製一份,引入庫檔案,修改一下配置,加入整合測試代碼。測試代碼一般需要三個部分,繼承自KIFTestController的類,擴充KIFTestScenario的方法,指定要執行哪些step,每個step調用KifTestStep,自己擴充KifTestStep來實現每個step的具體操作。

Kif文檔:https://github.com/square/KIF


另一個測試架構 Kiwi
Kiwi類似於系統內建的ocunit,在系統內建的test的target裡添加測試案例。
與ocunit相比,除了文法區別之外,還可以使用mock對象,可以非同步方法呼叫來測試。
不過對比GHUnit,非同步測試的方法不夠好用。
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.