首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在OCHamcrest中断言结构相等

在OCHamcrest中断言结构相等
EN

Stack Overflow用户
提问于 2012-03-06 13:36:41
回答 1查看 432关注 0票数 0

假设我想断言两个结构是等价的:

代码语言:javascript
复制
// Using CGPoint here for brevity, but my question applies to any struct type
CGPoint a = CGPointMake(1, 2);
CGPoint b = CGPointMake(1, 2);
STAssertEquals(a, b, @"this works");
assertThat(a, equalTo(b));

有没有办法用Hamcrest写一个断言,像上面的STAssertEquals一样工作?assertThat行无法编译,因为宏需要id参数,而结构不是。我尝试过sameInstanceequalTo匹配器的变体,但它们似乎都需要id类型的参数。接下来,我认为一个好的变通办法是断言任意表达式具有YESNO值。如下所示:

代码语言:javascript
复制
assertThat(a == b);

或者这样:

代码语言:javascript
复制
assertThat(a == b, isTrue());

但我在汉克雷斯特看不到这样的东西。

我是不是漏掉了什么明显的东西?显然,我可以通过使用诸如STAssertEquals之类的SenTest宏来完成我想要做的事情,但是我希望使用Hamcrest实现这些断言会很简单,这样我的所有断言都具有一致的风格。

我还知道我可以通过为我正在比较的特定结构实现一个自定义的Hamcrest匹配器来做到这一点。但我真的在寻找一个简单的断言/匹配器,它可以比较任何C结构的简单的字节相等。

也许这只是简单的情况,我提到的任何一种可能性在Hamcrest中都是不可能的。如果这是真的,我会接受一个令人信服的解释作为答案。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-07 22:32:00

OCHamcrest旨在检查对象是否匹配,因此assertThat将参数作为第一个参数(并将匹配器作为第二个参数)。

对标量的支持是有限的。例如,你可以说

代码语言:javascript
复制
assertThatInteger(a, equalToInteger(b));

已经向我发送了一个NSValue匹配器的更改,但我还没有时间查看它。它为NSPoint、NSSize等打开了大门,但OCHamcrest中的标量支持仍然是一个变通办法。

对于您自己的结构,我将使用STAssertEquals。问题是,这是一个要么全有要么全无的平等比较,这可能会使您的测试变得脆弱。如果发生这种情况,最好编写自己的自定义匹配器来支持每个字段的匹配。(我将尝试使NSValue匹配器成为您可以继承的子类。)

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

https://stackoverflow.com/questions/9578437

复制
相关文章

相似问题

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