首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OCUnit中的简化断言

OCUnit中的简化断言
EN

Stack Overflow用户
提问于 2010-02-12 04:06:24
回答 4查看 2.7K关注 0票数 3

我刚开始使用OCUnit,发现断言有点麻烦。在JUnit中,我可以像下面这样写一个测试来比较数字。这个测试显然会失败,但它显示了我可以为两个数字编写的很好的、简单的断言,以及我用很少的代码就得到的反馈:"expected <2> but was <3>“。

到目前为止,我尝试的I XCode是:

它可以工作,但不像JUnit那样优雅。你知道XCode (OCUnit)是否存在断言宏( assertion宏alàJUnit )吗?另外,是否有可能在XCode中获得红色/绿色条形图?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-02-24 08:31:35

首先要注意的是,OCUnit (又称SenTestingKit.framework)与Xcode集成在一起,但实际上并不是Xcode本身的一部分。OCUnit最初是第三方代码,后来成为Objective-C单元测试的事实标准,所以苹果公司采用了它,现在也在维护它。

更重要的是,您看到的输出似乎有些奇怪。我使用的是Snow Leopard附带的Xcode 3.2.1。我尝试了以下测试:

代码语言:javascript
复制
- (void) testNumbers {
    int number1 = 2;
    int number2 = 3;
    STAssertEquals(number1, number2, nil);
    STAssertEquals(4, 5, nil);
}

下面是我在Xcode build results窗格/窗口中看到的错误:

代码语言:javascript
复制
-[ExampleTest testNumbers] : '2' should be equal to '3'
-[ExampleTest testNumbers] : '4' should be equal to '5'

当我双击构建日志中的错误时,Xcode直接跳到失败的断言所在的行。

OCUnit宏当然不是完美的,但上面使用的示例非常冗长。宏需要2+或3+参数。(STFail是个例外,它只需要1+参数。)最后一个必需的参数始终是描述的可选格式字符串,任何其他参数都用于替换这些占位符,就像您对printf()NSLog()所做的那样。如果你传递nil,你只会得到默认的错误,没有额外的细节。

当测试确实需要上下文时,我通常只添加描述。例如,测试和/或断言的主题实际上意味着什么。通常,我只是将此信息作为注释包含在断言周围。越简单越好。:-)

为了回答你的最后一个问题,目前还没有一种方法可以在Xcode中获得一个红/绿条,就像你在JUnit看到的那样。这可能是一个很好的补充,但不是我个人认为关键的东西。YMMV.

票数 6
EN

Stack Overflow用户

发布于 2010-02-25 02:42:02

正如其他人所说,通过将nil作为最后一个参数传递,可以使宏更容易接受。如果测试失败,这将为您提供默认输出。当然,您可以在需要的时候提供自己的字符串。我经常发现这对于具有返回BOOLid的方法但通过引用获取NSError*的代码很有用:

代码语言:javascript
复制
- (void)testFoo {
  NSError *err;
  STAssertTrue([bar fooMethodReturningBOOLError:&err], @"Error: %@ (%@)", err, [err userInfo]);
}

关于红色/绿色条,作为构建窗口中构建的最后一步,您确实会得到红色/绿色的结果,但它不像在其他IDE中那样可见。有许多好的心理学文献表明,让它变得更加突出将是一个好主意。一定要在bugreport.apple.com上提交增强请求。你可以参考rdar://7685315 (我在这方面的建议)。

票数 1
EN

Stack Overflow用户

发布于 2013-01-28 09:31:16

现在有一个很棒的框架,叫做OCHamcrest。它允许你的测试断言读起来像一个句子,通常你不需要提供失败描述,对我来说,这是我在测试中最不想做的事情,因为它必须得到维护。

这是github的https://github.com/hamcrest/OCHamcrest

下面是自述文件中的一个示例

代码语言:javascript
复制
NSCalendarDate* date = [NSCalendarDate dateWithString:@"26 Apr 2008" calendarFormat:@"%d %b %Y"];
assertThat(date, is(onASaturday()))

断言对OCUnit非常友好,并且添加您自己的断言非常简单。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2247362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档