0

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

// 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));

有没有办法使用像STAssertEquals上面那样工作的 Hamcrest 来编写断言?该assertThat行无法编译,因为宏需要id参数,而结构不是。我尝试了equalTo匹配器的变体,例如sameInstance,但它们似乎都需要id类型参数。接下来,我认为一个好的解决方法是断言任意表达式具有YESorNO值。像这样的东西:

assertThat(a == b);

或这个:

assertThat(a == b, isTrue());

但我在 Hamcrest 没有看到这样的东西。

我错过了一些明显的东西吗?显然,我可以通过使用 SenTest 宏(STAssertEquals例如

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

也许只是因为我提到的所有可能性都不可能与 Hamcrest 一起开箱即用。如果这是真的,我会接受一个令人信服的解释作为答案。

谢谢

4

1 回答 1

0

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

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

assertThatInteger(a, equalToInteger(b));

NSValue 匹配器的更改已发送给我,但我还没有时间查看它。它为 NSPoint、NSSize 等打开了大门。但是,OCHamcrest 中的标量支持仍然是一种解决方法。

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

于 2012-03-07T14:32:00.260 回答