在OCHamcrest中断言struct equality

时间:2012-03-06 05:36:41

标签: objective-c hamcrest

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

// 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参数,而结构不是。{1}}。我尝试了equalTo匹配器的变体,例如sameInstance,但它们似乎都需要id类型的参数。接下来,我认为一个好的解决方法是声明任意表达式具有YESNO值。像这样:

assertThat(a == b);

或者这个:

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

但我在Hamcrest看不到这样的事情。

我错过了一些明显的东西吗?很明显,我可以通过使用STAssertEquals这样的SenTest宏来完成我想做的事情,但我原本以为使用Hamcrest实现这些断言很简单,所以我的所有断言都有一致的风格。

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

也许就是这种情况,我提到的任何可能性都不可能与Hamcrest开箱即用。如果这是真的,我会接受一个令人信服的解释,作为答案。

由于

1 个答案:

答案 0 :(得分:0)

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

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

assertThatInteger(a, equalToInteger(b));

我已经向NSValue匹配器发送了一个更改,但我还没有时间对其进行审核。它为NSPoint,NSSize等打开了大门。但是,OCHamcrest中的标量支持仍是一种解决方法。

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

相关问题