我正在尝试在OCUnit和Google Tool Box之间做出选择,你有任何偏好,会推荐其中一个,为什么?我很想知道你对2中任何一个的经历.
我对他们两个主要的问题是在测试方法中的崩溃管理(例如:BAD ACCESS)他们都没有能够告诉我在哪个类中发生了崩溃!
使用Google Tool Box,我可以看到正在运行哪个测试套件而不是测试用例(当您的测试套件有50个测试用例时,您应该怎么做?)
使用OCUnit,我至少可以看到测试套件导致崩溃的测试用例.
以下是我与GTB的消息:
Executed 0 tests, with 0 failures (0 unexpected) in 0.000 (0.000) seconds
Test Suite 'LogicTests' started at 2009-12-14 18:03:15 +0100
/Users/admin/Documents/Tests/GTBTest/RunIPhoneUnitTest.sh: line 122: 688 Segmentation fault "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents
Command /bin/sh failed with exit code 139
Run Code Online (Sandbox Code Playgroud)
我可以看到,正是测试套件'LogicTests'引发了崩溃,但就是这样.
使用OCunit,这里是同一错误的消息:
Test Suite 'LogicTests' started at 2009-12-14 17:51:26 +0100
Test Case '-[LogicTests testFail]' started.
/Developer/Tools/RunPlatformUnitTests.include: line 415: 536 Segmentation fault "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"
Run Code Online (Sandbox Code Playgroud)
至少对于OCUnit,我可以跟踪正在运行的测试用例并最终对其进行调试(但是这可能需要很长时间才能没有任何类和行号信息...)
你是如何处理这些问题的?
提前致谢.
PS:这里是如何重现问题,这很简单:
只需创建一个类,该方法在调用时会崩溃(在您执行TDD时会一直发生):
- (void) crashMethod {
NSMutableArray *crashArray; …Run Code Online (Sandbox Code Playgroud) 我有一个包含多个项目的Xcode 4工作区.一切都完美构建并按预期工作,只有Xcode经常重新编译文件.如果我点击Build按钮,等待编译成功,然后再次按下按钮,那不应该是非操作,因为没有文件发生变化吗?因为我的Xcode重新编译了项目的很大一部分.即使我建立然后立即点击播放按钮,我也必须再次盯着建筑过程.这是否是必要的,是否是预期的行为?
您能否提供有关以下perl代码段的详细说明.我从谷歌得到了一些想法,但仍有很多基本的混乱.如果你可以提供小笔记,那将是很有帮助的
$exit_value = $? >> 8;
$signal_num = $? & 127;
$dumped_core = $? & 128;
Run Code Online (Sandbox Code Playgroud) 我们有一个用XCTest编写的后端测试套件.该套件在Xcode中运行良好,但由于各种原因,如果我们也可以在iOS应用程序中运行该套件,那将对我们很好.那可能吗?我不介意为它编写一些粘合代码,但因为它甚至无法在非测试目标中导入XCTest框架:
SomeController.swift:2:8: Cannot load underlying module for 'XCTest'
Run Code Online (Sandbox Code Playgroud) (gdb) bt
#0 0x302ac924 in ___TERMINATING_DUE_TO_UNCAUGHT_EXCEPTION___ ()
#1 0x92077e3b in objc_exception_throw ()
#2 0x302d6ffb in -[NSObject doesNotRecognizeSelector:] ()
#3 0x3026e056 in ___forwarding___ ()
#4 0x3024a0a2 in __forwarding_prep_0___ ()
#5 0x00004ae9 in -[GameObject doesTouch:] (self=0xe893a0, _cmd=0x643ee, obj=0xe82e20) at /Users/aaa/Desktop/CPT/Game/Classes/GameObject.m:220
#6 0x00006e05 in -[StaticGrid checkTouchNearest:] (self=0xe82f20, _cmd=0x64ec3, obj=0xe893a0) at /Users/aaa/Desktop/CPT/Game/Classes/StaticGrid.m:62
#7 0x0000a393 in -[EAGLView touchesBegan:withEvent:] (self=0xe8dad0, _cmd=0x3199fa3c, touches=0x632c0b0, event=0xe14590) at /Users/aaa/Desktop/CPT/Game/Classes/EAGLView.m:459
#8 0x30910f33 in -[UIWindow _sendTouchesForEvent:] ()
#9 0x308faecb in -[UIApplication sendEvent:] ()
#10 0x309013e1 in _UIApplicationHandleEvent ()
#11 0x32046375 in PurpleEventCallback …Run Code Online (Sandbox Code Playgroud) 在Xcode 4中导入静态库头是否有最佳实践?我的大多数项目都依赖于其他几个项目,因此我最近开始使用工作区功能从一个地方构建所有需要的模块(我觉得非常方便).
糟糕的是我们不能在iOS上使用自定义框架,因此必须将依赖关系构建为静态库,并且我会遇到标头搜索路径的问题.虽然框架在框架包中保留了它们的标头,但静态库没有选项.我讨厌为我导入的每个库单独设置用户标题搜索路径.理想情况下,我想将依赖项目拖到工作区,将库添加到主目标并构建,无需进一步设置.是否支持此工作流程?
我有一个需要发送类型请求的Moose类Foo::Request.我需要从外部访问这个依赖项,以便我可以轻松地在测试中交换请求实现.我想出了以下属性:
has request_builder => (
is => 'rw',
isa => 'CodeRef',
default => sub {
sub { Foo::Request->new(@_) }
}
);
Run Code Online (Sandbox Code Playgroud)
然后在代码中:
my $self = shift;
my $request = $self->request_builder->(path => …);
Run Code Online (Sandbox Code Playgroud)
在测试中:
my $tested_class = …;
my $request = Test::MockObject->new;
$request->mock(…);
$tested_class->request_builder(sub { $request });
Run Code Online (Sandbox Code Playgroud)
是否有更简单/更惯用的解决方案?
这是我的代码中分配对象的常见模式,让它使用完成处理程序执行一些操作并在处理程序中释放它:
LongOperation *foo = [[LongOperation alloc] init];
[foo runWithCompletion:^{
// run some code and then:
[foo autorelease];
}];
Run Code Online (Sandbox Code Playgroud)
这很好用,但是当我尝试将代码转换为ARC时,Xcode正确地抱怨它不能简单地autorelease从块中删除,因为这会使foo对象在离开作用域后被释放.
那么在ARC下编写这种模式的好方法是什么?我可以为foo:引入一个实例变量:
[self setFoo:[[LongOperation alloc] init]];
[foo runWithCompletion:^{
// run some code and then:
[self setFoo:nil];
}];
Run Code Online (Sandbox Code Playgroud)
......但代码不再是可重入的.
memory-management objective-c objective-c-blocks automatic-ref-counting
我有一个UIWebView,当用户点击链接时我需要做一些事情.有一个委托回调,可用于检测水龙头:
- (BOOL) webView: (UIWebView*) webView
shouldStartLoadWithRequest: (NSURLRequest*) request
navigationType: (UIWebViewNavigationType) navigationType
{
if (navigationType == UIWebViewNavigationTypeLinkClicked) {
…
}
}
Run Code Online (Sandbox Code Playgroud)
问题是此代码不处理所有链接点击.例如,一个普通的Google搜索结果页面对链接做了一些奇怪的事情:
<a href="http://example.com/" class="l" onmousedown="return rwt(…)">
<em>Link Text</em>
</a>
Run Code Online (Sandbox Code Playgroud)
该rwt功能导致链接UIWebViewNavigationTypeLinkClicked在点击时不触发事件.有没有办法可靠地检测落入"导航到其他页面"存储桶的所有事件?
我有以下代码
#! /usr/bin/perl
use strict;
use warnings;
################### Start Main ####################
my @startupPrograms = qw(google-chrome thunderbird skype pidgin );
my @pagesToBeOpenedInChrome = qw(http://www.google.com/ http://stackoverflow.com/ https://mail.google.com/mail/u/0/#inbox);
main();
#################################################
sub main() {
}
Run Code Online (Sandbox Code Playgroud)
我得到以下警告
[aniket@localhost TestCodes]$ ./test.pl
Possible attempt to put comments in qw() list at ./test.pl line 8.
main::main() called too early to check prototype at ./test.pl line 9.
Run Code Online (Sandbox Code Playgroud)
程序运行正常,但我无法理解警告.他们的意思是什么?
perl ×3
ios ×2
objective-c ×2
xcode4 ×2
cocoa ×1
header-files ×1
iphone ×1
moose ×1
ocunit ×1
stack-trace ×1
tdd ×1
testing ×1
uiwebview ×1
unit-testing ×1
xcode ×1
xctest ×1