【问题标题】:Automatically creating conflicting NSFileVersions自动创建冲突的 NSFileVersions
【发布时间】:2012-08-21 10:12:22
【问题描述】:

我编写了一个自定义冲突处理例程,它会自动启动以解决 NSFileVersion 的冲突版本。现在我想编写单元测试以确保它有效。问题来了:

如何在单元测试中导致/创建冲突版本?

这本质上归结为:如何在不通过 iCloud 手动执行的情况下引发冲突?由于这仅用于测试目的,我不在乎使用私有 API 或直接侵入系统——只要结果是来自NSFileVersion's +unresolvedConflictVersionsOfItemAtURL 报告的冲突。任何建议将不胜感激!

最大

【问题讨论】:

  • 好像没有公开的方式。我现在已经提交了一个雷达:rdar://12196293。任何 hack 建议 仍将不胜感激。

标签: cocoa conflict icloud foundation nsfileversion


【解决方案1】:

您可以使用自己的版本修补 +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 ] ;

【讨论】:

  • 谢谢!这是我已经考虑过的一种方法。但是,这仍然不会导致调用正确的方法(即didGainVersion),并且不会真正发生冲突,只需通过一个 API 模拟即可。但最终它可能会起作用(即通过 OCMock 添加伪造的 Version 对象)。
  • 你说黑客没问题 :) 不确定这对于你的测试目的是否足够强大。似乎如果您编写更多代码和/或使用单独的 pted 机器,您可以自动创建实际冲突的版本?
  • 一位 DTS 工程师回复我的一封电子邮件说,目前唯一的公共方式涉及多台机器。我可以使用虚拟机,或者只使用这个 hack。谢谢!
猜你喜欢
  • 2011-10-13
  • 2017-07-15
  • 2021-05-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多