2012-08-26 89 views
6

我寫了一個自動衝突處理例程,自動啓動解決衝突版本的NSFileVersion。現在我想編寫單元測試,以確保它的工作。這裏是問題:自動創建衝突NSFileVersions

如何在單元測試中導致/創建衝突版本?

本質問題歸結爲:如何通過iCloud手動執行衝突而導致衝突?由於這僅用於測試目的,我不關心使用私有API或直接向系統進行黑客入侵 - 只要結果是從NSFileVersion's +unresolvedConflictVersionsOfItemAtURL報告的衝突。任何建議將不勝感激!

最大

+0

似乎沒有公開的方式。我現在已經提交了一個雷達:[rdar:// 12196293](http://openradar.appspot.com/12196293)。任何*黑客建議*仍將不勝感激。 –

回答

3

你可以用自己的版本,返回版本衝突的數組補丁+unresolvedConflictVersionsOfItemAtURL

#import <objc/runtime.h> 

static IMP __originalUnresolvedConflictVersionIMP = NULL ; 
static NSArray * MyNSFileVersionUnresolvedConflictVersions(id self, SEL _cmd, NSURL * url) 
{ 
    // this code just calls the original implementation... 
    // You can return an array of conflicting NSFileVersion objects instead... 

    NSLog(@"%s called\n", __PRETTY_FUNCTION__) ; 
    return (*__originalUnresolvedConflictVersionIMP)(self, _cmd, url) ; 
} 


@implementation NSFileVersion (Test) 

+(void)load 
{ 
    __originalUnresolvedConflictVersionIMP = class_replaceMethod(objc_getMetaClass("NSFileVersion") , @selector(unresolvedConflictVersionsOfItemAtURL:), (IMP)MyNSFileVersionUnresolvedConflictVersions, "@@:@") ; 
} 

@end 

這就夠了去?我可能會首先嚐試在我的替換「方法」:

return [ [ self otherVersionsOfItemAtURL:url ] lastObject ] ; 
+0

謝謝!這是我已經考慮過的一種方法。然而,這仍然不會導致正確的方法(即'didGainVersion')被調用,並且不會有真正的衝突,只是通過一個API進行模擬。但最終它可能是工作的(即通過通過OCMock添加僞造的版本對象)。 –

+0

你說hack是好的:)不確定這是足夠強大的測試目的。似乎是否你寫了更多的代碼和/或使用一個單獨的pted機器,你可以自動創建實際上是衝突的版本? – nielsbot

+0

DTS工程師回覆了我的一封電子郵件,表示目前唯一的公共途徑涉及多臺機器。我可以使用虛擬機,或者只是使用這個黑客。謝謝! –