2012-08-26 17 views
6

He escrito una rutina de manejo de conflictos personalizada que se activa automáticamente para resolver las versiones conflictivas de NSFileVersion. Ahora quiero escribir pruebas unitarias para asegurarme de que funciona. Aquí está la pregunta:Creación automática de NSFileVersions en conflicto

¿Cómo puedo causar/crear versiones conflictivas dentro de una unidad de prueba?

Este esencial se reduce a: ¿cómo puedo causar un conflicto sin hacerlo manualmente a través de iCloud? Dado que esto es solo para fines de prueba, no me importa si utilizo una API privada o pirateo informático directamente en el sistema, siempre que el resultado sea un conflicto informado de NSFileVersion's +unresolvedConflictVersionsOfItemAtURL. ¡Cualquier consejo sería muy apreciado!

Max

+0

Parece que no hay una vía pública. He archivado un radar por ahora: [rdar: // 12196293] (http://openradar.appspot.com/12196293). Cualquier * sugerencia de hack * aún sería apreciada. –

Respuesta

3

Se puede parchear +unresolvedConflictVersionsOfItemAtURL con su propia versión que devuelve un conjunto de versiones contradictorias:

#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 

Es eso suficiente para seguir adelante? Primero podría probar esto en mi "método" de reemplazo:

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

Gracias! Este es un enfoque que ya he pensado. Sin embargo, esto aún no provocaría que se llamaran los métodos correctos (es decir, 'didGainVersion'), y no habría realmente un conflicto, simplemente simulado a través de una API. Pero al final podría ser un trabajo (es decir, al agregar objetos de Versión falsificados a través de OCMock). –

+0

Dijiste que los hacks estaban bien :) no estoy seguro de que esto sea lo suficientemente fuerte para tus propósitos de prueba. Parece que si escribiste un poco más de código y/o usaste una máquina separada, ¿podrías crear automáticamente versiones conflictivas? – nielsbot

+0

Un ingeniero de DTS respondió a uno de mis correos electrónicos diciendo que actualmente la única forma pública implica más de una máquina. Podría usar una VM, o simplemente usar este truco. ¡Gracias! –

Cuestiones relacionadas