2012-08-26 9 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)が呼び出されることはなく、実際には1つのAPIを介してシミュレートされただけの競合はありません。しかし、最終的には(つまり、OCMockを介して偽装されたバージョンオブジェクトを追加することによって)うまくいく可能性があります。 –

+0

あなたはハッキングが大丈夫だと言っています:)これはあなたのテスト目的のために十分に強いとは確信していません。もう少しコードを書いたり、別々のマシンを使用して実際に競合するバージョンを自動的に作成できると思われますか? – nielsbot

+0

DTSエンジニアは私の電子メールの1つに、現時点で唯一の公的な方法は複数のマシンが関わっていると答えました。私はVMを使うことも、このハックを使うこともできます。ありがとう! –

関連する問題