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,非同步測試的方法不夠好用。