我在使用内置的Xcode单元测试框架SenTestingKit测试一些宏的中央调度代码时遇到了一些麻烦.我成功地解决了我的问题.我有一个单元测试,它构建一个块并尝试在主线程上执行它.但是,该块永远不会被实际执行,因此测试会挂起,因为它是同步调度.
- (void)testSample {
dispatch_sync(dispatch_get_main_queue(), ^(void) {
NSLog(@"on main thread!");
});
STFail(@"FAIL!");
}
Run Code Online (Sandbox Code Playgroud)
什么是导致它挂起的测试环境?
我正在尝试使用Xcode上的基本SenTest框架来测试读取和更改钥匙串的代码.代码在设备上工作正常,但是当我开始测试时,每次我想用SecItemDelete/ SecItemAdd/ etc 触摸钥匙串时都会出现这些错误.
The operation couldn’t be completed. (OSStatus error -34018 - client has neither application-identifier nor keychain-access-groups entitlements)
我iOS Team Provisioning Profile: *为构建目标和测试目标配备了通配符配置文件().
这些(未经证实的)堆栈溢出答案:
从钥匙串中读取结果为errSecItemNotFound 25300
假设我每次使用钥匙串时都需要一个与我的应用程序标识符匹配的配置文件,但这可能不对,或者我会在测试目标之外得到相同的错误.
更深入地挖掘(未经证实的)答案:
SecItemAdd和SecItemCopyMatching返回错误代码-34018(errSecMissingEntitlement)
意味着钥匙链中可能存在一个错误,更普遍的Security.framework是,坦率地说这是一个可怕的错误.
我的问题是; 有没有人只有当他们在测试目标上时才会遇到OSStatus错误-34018 ?这似乎是我所看到的行为.
编辑:添加JorgeDeCorte在下面的答案中使用的答案.
如果问题在您的单元测试目标中退出,则此线程似乎包含解决方案.
https://devforums.apple.com/message/917498#917498
基本上,您必须通过在测试目标中添加以下作为运行脚本来对.xcttest文件夹进行编码.
codesign --verify --force --sign "$CODE_SIGN_IDENTITY" "$CODESIGNING_FOLDER_PATH"在设备上测试我的钥匙串时,我收到了很多-34018错误,并设法解决了这个问题.
如果您的测试目标中不存在该问题,则可能不是解决方案.
所以我猜解决方案是:强制签署您的测试目标.
这与我之前提出的问题有关,但不同之处,我认为我会把它扔进一个新问题.我有一些代码在自定义队列上运行异步,然后在完成时在主线程上执行完成块.我想围绕这种方法编写单元测试.我的方法MyObject看起来像这样.
+ (void)doSomethingAsyncThenRunCompletionBlockOnMainQueue:(void (^)())completionBlock {
dispatch_queue_t customQueue = dispatch_queue_create("com.myObject.myCustomQueue", 0);
dispatch_async(customQueue, ^(void) {
dispatch_queue_t currentQueue = dispatch_get_current_queue();
dispatch_queue_t mainQueue = dispatch_get_main_queue();
if (currentQueue == mainQueue) {
NSLog(@"already on main thread");
completionBlock();
} else {
dispatch_async(mainQueue, ^(void) {
NSLog(@"NOT already on main thread");
completionBlock();
});
}
});
Run Code Online (Sandbox Code Playgroud)
}
我投入了主队列测试以获得额外的安全性,但它总是能够击中dispatch_async.我的单元测试如下所示.
- (void)testDoSomething {
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
void (^completionBlock)(void) = ^(void){
NSLog(@"Completion Block!");
dispatch_semaphore_signal(sema);
};
[MyObject doSomethingAsyncThenRunCompletionBlockOnMainQueue:completionBlock];
// Wait for async code to finish
dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); …Run Code Online (Sandbox Code Playgroud) 我已经为单元测试设置了一个XCode 5 iOS 7项目.
当然,设置单元测试花了我很长时间,以至于我正在努力保持它的价值.在这个错误上挣扎了好几个小时:
ld: building for iOS Simulator, but linking against dylib built for MacOSX file
'/Applications/Xcode5-DP5.app/Contents/Developer/Library/Frameworks/XCTest.framework/XCTest'
for architecture i386
Run Code Online (Sandbox Code Playgroud)
关于如何解决的任何想法?
我想在iOS中进行单元测试.默认情况下,测试类是使用Xcode 5中的XCTest框架类创建的.我在早期版本的iOS中使用过SenTestingKit.这两个框架之间有什么区别?XCTest框架有哪些优点.我搜索相关文档,但我没有找到任何.我发现的只是套件中使用的接口类.谁能指出我相关的资源.
我一直在关注这篇博文:将单元测试添加到现有项目中.
但是我收到了这个错误:
ld:找不到文件:Build/Products/Debug-iphoneos/MyApp.app/MyApp Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/clang失败,退出代码为1
我有我的测试目标属性,
Bundle Loader = $(BUILT_PRODUCTS_DIR)/MyApp.app/MyApp
测试主机= $(BUNDLE_LOADER)
(它们都等同于:build/Debug-iphoneos/MyApp.app/MyApp)
我猜测这些变量并没有指向与编译器相同的位置."build/Debug-iphoneos/..."vs"Build/Products/Debug-iphoneos/......"
我可能完全错误的猜测,但无论哪种方式,有没有人知道是什么导致了这个错误或我将如何修复这些环境变量?
谢谢你的帮助,
山姆
有没有办法加载原型单元格,以及故事板中定义的任何IBOutlet连接?
更新
我想对单元格(单元的UICollectionViewCell)进行单元测试,因此希望将它加载到UIViewController上下文之外.
实际上,就像您可以从笔尖加载自定义视图一样,指定其文件的所有者并设置其IBOutlet.
我正在尝试为json验证编写单元测试(因为app严重依赖于来自其余API的json).
我有一个包含简单json的本地文件:"goodFeaturedJson.txt"
内容:
{
"test": "TEST"
}
Run Code Online (Sandbox Code Playgroud)
测试用例:
- (void)testJsonIsValid
{
Featured *featured = [Featured new];
NSString* filepath = [[NSBundle mainBundle]pathForResource:@"goodFeaturedJson" ofType:@"text"];
NSData *data = [NSData dataWithContentsOfFile:filepath];
NSString *jsonString = [[NSString alloc] initWithContentsOfFile:filepath encoding:NSUTF8StringEncoding error:nil];//[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"The json string is: %@", jsonString);
id JSON = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
STAssertTrue([featured jsonIsValid:JSON], @"Featured Data is NOT valid...");
}
Run Code Online (Sandbox Code Playgroud)
每次测试失败.控制台打印:
The json string is: (null)
Run Code Online (Sandbox Code Playgroud)
为什么?我知道为什么测试失败了,因为很明显,如果数据是nil/null,那么就没有有效的json,并且验证器将会中断(如果它无效则应该中断).
我必须在这里找到一些简单的东西,任何想法?
我正在开发一个数据库访问库,我正在尝试使用已经编写的单元测试来检查内存泄漏.
这些是基于SenTestingKit的逻辑测试,在Xcode 4.2中设置了正常的方式.我可以使用Cmd-U运行它们,但是没有办法从Instruments启动它们,或者调用Instruments来检查它们.
我怎样才能做到这一点?我是否需要编写新案例并将其构建到应用程序中?
(这个问题是关于泄漏检查单元测试,但我认为是pre-SenTestingKit.)
我刚下载并安装了Xcode5 GM种子.我删除了以前的xcode(DP5).当我打开我的项目时,选择"iPhone Retina(4英寸64位)"并输入Command-U来运行我的SenTeskingKit单元测试,xcode总是抱怨"模拟器正在使用 - 模拟器无法启动因为它已经在使用中." 我已经运行xcode-select指向新的xcode,重新启动我的MacBookPro,并确保在Activity Monitor下没有其他iPhone sim进程运行.和想法?TIA.麦克风
sentestingkit ×10
ios ×5
objective-c ×5
xcode5 ×3
ocunit ×2
unit-testing ×2
xcode ×2
64-bit ×1
instruments ×1
ios7 ×1
iphone ×1
json ×1
memory-leaks ×1
parsing ×1
uikit ×1
xcode4 ×1