我一直在XCode 3.0中使用OCUnit(XCode附带的默认安装).我很高兴能够运行我的测试并在Build Results窗口中看到结果,以及我输出的任何NSLog()消息.
但是,使用XCode 3.1,测试运行正常,但我突然失去了我的NSLog()输出.有谁知道它去了哪里?
我是ocUnit的新手,我试图将2个数组与STAssertTrue方法进行比较,并且==表示相等.
下面的测试只是询问被测系统(sut)的数据
- (void) testParse {
SomeClassForTesting* sut = [[SomeClassForTesting alloc] init];
NSArray* result = [sut parseAndReturn];
NSArray* expected = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4",nil];
STAssertTrue(result == expected, @"This test failed");
}
Run Code Online (Sandbox Code Playgroud)
然后在我的生产代码中,我只返回相同的数组
- (NSArray *)parseAndReturn
{
NSArray* x = [[NSArray alloc] initWithObjects:@"1", @"2", @"3", @"4",nil];
return x;
}
Run Code Online (Sandbox Code Playgroud)
然而,当测试运行时,我失败了.我应该如何比较这些对象,看它们是否相同?
先感谢您
我正在开发一个应用程序UIAlertView,只有在游戏进度完成时才会显示一个点击它的退出按钮.我想知道如何使用OCUnit拦截UIAlertView并与之交互,甚至检测它是否已经呈现.我唯一能想到的就是monkeypatch [UIAlertViewDelegate willPresentAlertView],但这让我想哭.
有谁知道更好的方法吗?
我在测试一些使用通知的逻辑时遇到了困难.我已经阅读了有关强制执行特定信息NSNotifications的内容,但这并没有真正解决我所看到的问题.
[SomeObject PerformAsyncOperation]创建一个NSURLRequest并将自己设置为响应委托.根据响应的内容,将SomeObject成功或失败发布NSNotification到默认值NSNotificationCenter.
我的测试的问题是,在PerformAsyncOperation调用之后,测试不会等待响应被发送.相反,它继续使用断言 - 失败,因为请求/响应没有时间发送/接收/解析.
这是代码:
-(void)testMethod {
SomeObject *x = [[SomeObject alloc] init];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(success:)
name:SomeObjectSuccess
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(failure:)
name:SomeObjectFailure
object:nil];
operationCompleted = false; // declared in .h
[x PerformAsyncOperation:@"parameter"];
STAssertTrue(operationCompleted , @"Operation has completed.");
[[NSNotificationCenter defaultCenter] removeObserver:self name:SomeObjectSuccess object:nil];
[[NSNotificationCenter defaultCenter] removeObserver:self name:SomeObjectFailure object:nil];
[x release];
}
-(void) failure:(NSNotification *) notification {
operationCompleted = true;
NSLog(@"Received failure message."); …Run Code Online (Sandbox Code Playgroud) 看来,我已将所有设置都设置正确.当我运行命令-u(或从菜单中选择产品 - 测试)测试运行正常.
最佳实践应该是,测试应该尽可能频繁地运行,理想情况是在每次构建期间(在每次运行期间理解).
如何强制XCode 4这样做?我试过:
但似乎没什么用.有没有人成功设置这个?
我似乎能够找到用于测试异常的唯一解决方案是使用SenTestingKit的STAssertThrows和STAssertThrowsSpecific,但是在抛出异常的两种情况下,被测试的应用程序都会挂起,直到我手动要求它继续.当然,测试框架应该吞下这些例外吗?如果没有,是否有人对测试异常有任何建议?
我在Xcode和它的"日志导航器"中有一个非常偷偷摸摸的问题.
我重新创造了这样的问题; 我有一个非常简单的OCUnit测试:
-(void)testSimpleFailure{
STFail(@"Please fail!");
}
Run Code Online (Sandbox Code Playgroud)
我清理我的构建,我构建我的测试方案,并运行我的测试.
在输出控制台窗口中,我看到我的所有测试执行,包括上面的测试.控制台显示实际运行的测试AND失败:
##teamcity[testFailed name='-|[SimpleTestClassTests.testSimpleFailure|]' message='Please fail!' details='']
Run Code Online (Sandbox Code Playgroud)
但是,Xcode显示"Tests Succeeded overlay",左侧的"Log Navigator"表示没有问题,全部都是绿色.
还有其他人有过类似的问题吗?有谁知道如何解决这个问题?
在我承诺之前,我非常希望不会得到误报.
编辑澄清我的问题.
对IBOutlets进行单元测试有点容易,但IBActions呢?我试图找到一种方法,但没有任何运气.有没有办法在View Controller中的IBAction和nib文件中的按钮之间进行单元测试连接?
我的单元测试套件包含一些仅适用于最新iOS版本的测试用例.预计,在较旧的iOS版本上运行套件时,这些测试会失败.
是否有标准方法来指示这些测试用例应仅在特定的iOS版本上运行?
我想到的一个选择:
- (void) testSomethingThatOnlyWorksOniOS7
{
const BOOL iOS7OrHigher = floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1;
if (!iOS7OrHigher) return;
// Actual test goes here
}
Run Code Online (Sandbox Code Playgroud)
或者,我可以告诉SenTestCase您动态跳过某些测试吗?
有没有办法在 Xcode4 中“测试”当前文件?
也就是说,如果您正在编写第 10 个单元测试,但您不想进行 TEST 并运行所有单元测试,而是只想触发在当前所在的单元测试文件中运行这些测试?
ocunit ×10
unit-testing ×5
ios ×4
xcode ×4
objective-c ×3
xcode4 ×2
exception ×1
ios4 ×1
iphone ×1
nslog ×1
uialertview ×1
xctest ×1