2012-08-26 12 views
6

Ho scritto una routine di gestione dei conflitti personalizzata che si attiva automaticamente per risolvere versioni in conflitto di NSFileVersion. Ora voglio scrivere dei test unitari per assicurarmi che funzioni. Ecco la domanda:Creazione automatica di versioni NSFile in conflitto

Come si creano/creano versioni in conflitto all'interno di un test di unità?

Questo essenziale si riduce a: come posso causare un conflitto senza eseguirlo manualmente tramite iCloud? Poiché questo è solo a scopo di test, non mi interessa abput utilizzando API private o hacking direttamente nel sistema, a patto che il risultato sia un conflitto segnalato da NSFileVersion's +unresolvedConflictVersionsOfItemAtURL. Qualsiasi consiglio sarebbe molto apprezzato!

Max

+0

Sembra non esserci alcun modo pubblico. Per ora ho archiviato un radar: [rdar: // 12196293] (http://openradar.appspot.com/12196293). Qualsiasi suggerimento * di hacking * sarebbe comunque apprezzato. –

risposta

3

Si potrebbe rattoppare +unresolvedConflictVersionsOfItemAtURL con la propria versione che restituisce un array di versioni contrastanti:

#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 

E 'abbastanza per andare avanti? Potrei prima provare questo nel mio "metodo" di sostituzione:

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

Grazie! Questo è un approccio a cui ho già pensato. Questo, tuttavia, non causerebbe ancora la chiamata dei metodi giusti (cioè 'didGainVersion'), e non ci sarebbe realmente un conflitto, solo simulato attraverso un'API. Ma alla fine potrebbe funzionare (ad esempio aggiungendo oggetti di versione falsificati tramite OCMock). –

+0

Hai detto che gli hack erano ok :) non sono sicuro che sia abbastanza forte per i tuoi scopi di test. Sembra che tu abbia scritto un po 'più di codice e/o usato una macchina separata pted per creare automaticamente versioni in conflitto? – nielsbot

+0

Un ingegnere DTS ha risposto a una delle mie e-mail dicendo che attualmente l'unica strada pubblica riguarda più di una macchina. Potrei usare una VM, o semplicemente usare questo hack. Grazie! –

Problemi correlati