2012-08-26 12 views
6

Ich habe eine benutzerdefinierte Konfliktbehandlungsroutine geschrieben, die automatisch startet, um in Konflikt stehende Versionen von NSFileVersion zu lösen. Jetzt möchte ich Komponententests schreiben, um sicherzustellen, dass es funktioniert. Hier ist die Frage:Automatisches Erstellen von NSFileVersions-Konflikten

Wie verursache ich inkompatible Versionen innerhalb eines Komponententests?

Diese essentiall läuft auf: wie verursache ich einen Konflikt, ohne es manuell durch iCloud zu tun? Da dies nur zu Testzwecken ist, ist es mir egal, ob ich mit privater API hacken oder direkt in das System hacken kann - solange das Ergebnis ein Konflikt ist, der von NSFileVersion's +unresolvedConflictVersionsOfItemAtURL gemeldet wird. Jeder Rat würde sehr geschätzt werden!

Max

+0

Es scheint keinen öffentlichen Weg zu geben. Ich habe ein Radar für jetzt abgelegt: [Rdar: // 12196293] (http://openradar.appspot.com/12196293). Alle * Hack Vorschläge * würden immer noch geschätzt werden. –

Antwort

3

Sie könnten +unresolvedConflictVersionsOfItemAtURL mit Ihrer eigenen Version patchen, die eine Reihe von widersprüchlichen Versionen gibt:

#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 

Ist das genug, um auf zu gehen? Ich könnte zuerst dies in meinem Ersatz "Methode" versuchen:

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

Danke! Dies ist ein Ansatz, über den ich bereits nachgedacht habe. Dies würde jedoch immer noch nicht bewirken, dass die richtigen Methoden (d. H. "DidGainVersion") aufgerufen werden, und es würde nicht wirklich einen Konflikt geben, der nur durch eine API simuliert wird. Aber am Ende könnte es funktionieren (d. H. Indem gefälschte Version-Objekte über OCMock hinzugefügt werden). –

+0

Sie sagten, Hacks waren in Ordnung :) nicht sicher, das ist stark genug für Ihre Testzwecke. Scheint es, wenn du ein bisschen mehr Code geschrieben hast und/oder einen separaten Ping-Computer benutzt hast, könntest du tatsächlich widersprüchliche Versionen erstellen? – nielsbot

+0

Ein DTS-Techniker hat auf eine meiner E-Mails geantwortet, dass derzeit der einzige öffentliche Weg mehr als eine Maschine betrifft. Ich könnte eine VM verwenden oder einfach diesen Hack verwenden. Vielen Dank! –