2012-08-26 40 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工程师回复了我的一封电子邮件,表示目前唯一的公共途径涉及多台机器。我可以使用虚拟机,或者只是使用这个黑客。谢谢! –